2011-06-19 12 views
2

OK。私は、ユーザーが「勝者を選ぶ」システムを作成しています。私は "マッチアップ"テーブルと "ピック"テーブルを持っています。マッチアップのウェブページでは、その日の全てのマッチアップを、その日のすべてのピックと一緒にコンテキストにロードします。カスタムDjangoテンプレートタグにオブジェクトを渡すにはどうしたらいいですか?私は方法を考え出したが、それはハッキーに見える。

ここでは、ユーザーがそのアイテムを「選択」できるように、選択肢の横にチェックマークイメージを表示する必要があります(スタックオーバーフローの「ベストアンサー」チェックと同じです)。 (またはアップ状態、または "ウォン状態"または "ロスト状態")、私はテンプレートタグを作成しています。ここで

はテンプレート

3 {% load matchup_tags %} 
    4 
    5 {% for matchup in matchups %} 
    6  <div class="grid_6" style="margin-top:15px; border:1px solid black;"> 
    7 
    8    <div class="div-status"><span class="game-status">{{matchup.status}}</span></div> 
    9    <div class="opt1"> 
10     <div class="pick-home {% get_check matchup picks %}"> 

から関連するスニペットであるあなたが見ることができるように、get_checkテンプレートタグがループ内で実行されます。現在のマッチアップを、このテンプレートタグのピックリストとともに渡します。ここで

1 from django.template import Library, Node 
    2 from matchup.models import * 
    3 
    4 register = Library() 
    5 
    6 class PickerNode(Node): 
    7  def __init__(self , matchup , picks): 
    8   self.matchup , self.picks = matchup , picks 
    9   
10  def render(self, context): 
11   p = context['picks'] 
12   return p[0].pick 
13  
14 def get_check(parser, token): 
15  bits = token.contents.split() 
16  return PickerNode(bits[1] , bits[2]) 
17 
18 get_check = register.tag(get_check) 

あなたは私のテンプレートタグからライン12を見れば、私が代わりにビット[2]変数(ピックのコンテキスト変数を使用していますテンプレートタグで私の「ハッキング」の試みであります私の見解では "ピック"と呼ばれていました)。

テンプレートタグにオブジェクトを渡すことができますか?そして、私が文脈でオブジェクトにアクセスできるだけでは、なぜ私は気にしませんか?

編集:以前、代わりにコンテキストを使用すると、エラー

乾杯私は 「戻りself.picks.pick」のようなものをやっていたし、それはいくつかの「『選ぶ』プロパティが含まれていませんユニコード」を投げていました!

+1

はい、テンプレートタグにオブジェクトやスカラー値を渡すことができます。コンテキストから変数を解決することもできます。私はDjangoのテンプレートシステムについて、どれが効率的であるかを伝えるための十分な技術知識がありません。誰もそれに話すことができますか?私もそれについてもっと学ぶことに興味があります。 – Brandon

答えて

3

これは、必要以上に難しくしています。これを行う最善の方法は、タグではなくフィルタを使用することです。私は正確にあなたがやろうとしているん何転倒 "アプリを構築しました

@register.filter 
def get_check(matchup, picks): 
    # your logic here 


{{ matchup|get_check:picks }} 
+1

+1時には、フィルタの意味を忘れて、単純なタグとして使用するほうがずっと簡単です。 –

3

:フィルタは、すでに彼らに渡されたそれに関連する変数の値を取得します。それは、まだ再利用可能な状態ではないのですが、私はあなたが以下で何をしようとして達成:

@register.simple_tag 
def tipped(registration, match, team): 
    try: 
     tip = get_tip(registration, match) 
     if tip.winner == team: 
      return "selected" 
    except Exception,e: 
     pass 
    return "" 

テンプレート:

私はカスタムにオブジェクトを直接必要がた私の場合は
<input type="submit" value="{{ match.home_team.display_name }}" class="button {% tipped registration match match.home_team %}"/> 
0

が見えます。 This Sectionは、Djangoドキュメントの使用方法を示しています。

template.Variable(string_token_passed_to_tag) 
関連する問題