2009-08-22 22 views
3

私は、任意の数の引数を取るDjangoの包含タグを記述しようとしている:djangoインクルージョンタグの任意の位置引数の数は?

@register.inclusion_tag('so.html') 
def table_field(*args): 
fields = [] 
for arg in args: 
    fields.append(arg) 
return { 'fields': fields, } 

しかし、私はDjangoのテンプレートエンジンからこれを呼び出すとき:

{% table_field form.hr form.bp form.o2_sat %} 

私はエラーを取得します:

table_field takes 0 arguments 

これは、djangoのテンプレートエンジンのさらにもう1つの制限ですか?

答えて

0

これはdjangoのインクルージョンタグのもう1つの制限です。現在、djangoのトランク版ではこれはできません。

+0

これについて進歩があったのであれば、どんな考えですか? – Oli

1

あなたは自分のテンプレートタグを書く必要があります。

2

再:私は、任意の数の引数を取るDjangoの包含タグを記述しようとしている

私はあなたがいくつかの並べ替えとして、単一の引数としてビューからで任意の数の引数を渡すべきだと思い

コレクション。 documentationに基づいて

、私はあなたがビューからテンプレートに含めるタグにいくつかのコレクションオブジェクトを渡して、として包含タグを記述するべきだと思います。そして、あなたのテンプレートは次のようになります

@register.inclusion_tag('so.html') 
def table_field(args): 
    return { 'fields': [arg for arg in args], } 

{% table_field whatever_was_passed_in_from_the_view %} 

私は、テンプレートがデータの選択に関してプレゼンテーションの決定を下すことが予想され、その決定がビューで最もうまく処理されるとは思いません。

+2

私の質問では、任意の数の引数をインクルードタグに渡すことについて質問しますが、1つの引数だけを含むインクルードタグを投稿します。論理はどこですか?私はデザインについて聞いて覚えていません。私はすでにテンプレートがこのプレゼンテーションロジックの正しい場所だと決めました... – slypete

+0

時には、 "しないでください"が正しい答えです。 – hughdbrown

+0

私は理解しています。しかし、この場合ではありません。 – slypete

3

1.2.1以降では、引数をインクルードタグに渡すことができます。ここで

@register.inclusion_tag("voting/vote_form.html", takes_context=True) 
def vote_form(context, vote_object, vote_dict, score_dict): 
    if isinstance(vote_dict, dict): 

議決templatetagsをDjangoのために私の改造から一例であり、テンプレートは以下のようになります。私はこのことについては好きではない何

{% vote_form bookmark vote_dict score_dict %} 

名に方法はありません議論は、それらを順番に置くだけですが、うまくいきます。

今私には分かりませんが、なぜ今、あなたのインクルードテンプレートのレンダリングに使用するために返されるコンテキストと共に、その親コン​​テキストが渡されないようにする必要があります。

あなたが* argsを使用しようとすると機能しません。なぜなら、渡されたargsの数が関数に対してチェックされているからです。

+0

こんにちはマーク、これは1.2.1では新しくありません。私はしばらくそれをしてきました。私の質問は、任意の位置的な議論に関するものでした。あなたの答えはこのトピックについて1つの文を持ち、昨年からの私の答えを模倣しています。 – slypete

+0

申し訳ありませんが、ページのどこにでも1つの文章が表示されません。コードのそのレベルで行われたチェックは、あなたが求めていることをすることを不可能にします。インクルードタグに渡されたargsの数が明示的にチェックされています。このチェックでは、* argsを使って何をするのか分からないので、インクルードタグではできません。その小切手がそこになかったなら、または切れるかもしれない、あなたは行くのが良いでしょう。私はそれが不可能であることがわかっていた唯一の理由は、その領域でデバッグされたことが起こった。 – boatcoder

+0

問題は、任意の数の引数を扱う方法を尋ねることです。この答えは、有限数を扱う方法だけを示しています。 – Apreche

関連する問題