2011-02-09 20 views
5

上のフォームに属性を追加する方法私は次のテンプレートがあるとします。DjangoはHTMLテンプレート

がどのように私はform.openid_identifierするCSSクラスを追加することができます

<div id="openid_input_area"> 
{{ form.openid_identifier }} 
    <input name="bsignin" type="submit" value="{% trans "Sign in" %}"> 
</div> 

私はSOC原則に付着していると私はデザイナーが、私はではないは、フォームのモデルではなく、テンプレート自体にこれを行うにはしたくないテンプレートを改善するために期待していたよう。

私はこの文書で何も見つかりませんでした。テンプレートでこれを行う方法はありますか?

答えて

16

私は私の問題にシンプルなソリューションをコーディングするために管理してきました:

私はcustom template tagを書いた:

from django import template 

register = template.Library() 

def htmlattributes(value, arg): 
    attrs = value.field.widget.attrs 


    data = arg.replace(' ', '') 

    kvs = data.split(',') 

    for string in kvs: 
     kv = string.split(':') 
     attrs[kv[0]] = kv[1] 

    rendered = str(value) 

    return rendered 

register.filter('htmlattributes', htmlattributes) 

そして、私がしなければならないすべてをテンプレートは:

{{ form.openid_identifier|htmlattributes:"class : something, id: openid_identifier" }} 
2

私はプレーンなDjangoで他の方法を知らない。 form.fieldform.as_pのようなショートカットは本当に始まりますが、最終的には普通のhtmlに戻すことができます。それが私の見方です。レンダリングをもっとコントロールする必要はないと言っているわけではありません。私はDjangoのメーリングリストでthis discussion about form renderingを読むことを覚えています。

Simon Willisonは、デザイナーがより多くの制御を行うためにライブラリに取り組んでいます。そのソースはon githubです。ちょっと古いので、もう動作しないかもしれません。しかし、あなたの質問に関しては、この例では、それはあなたに使用のものであってもよいようになっています

{% field form.name class="myclass" %} 
<!-- renders as --> 
<input type="text" name="name" id="id_name" class="myclass"> 

は実際にこの機能を達成するのは簡単なはずです。フォームフィールドを受け入れ、ウィジェットの属性(フォームにすでに設定可能なもの)を更新してフィールドをレンダリングするテンプレートタグが必要です。

フォームを反復するとBoundFieldのインスタンスが生成され、そのインスタンスは__unicode__メソッドとなります。すべてのキーワード引数をウィジェットレンダリング関数に渡す必要があります。このアイデアのドラフト:

@register.simple_tag 
def field(boundfield, **kwargs): 
    if self.field.show_hidden_initial: 
     return self.as_widget(attrs=kwargs) + self.as_hidden(only_initial=True) 
    return self.as_widget(attrs=kwargs) 
関連する問題