2012-03-07 15 views
3

をレンダリングしながら、私はDjangoのフォームの一部のフィールドのための余分に関する情報を追加し、いくつかの余分なHTMLタグ フォームフィールド内の余分な情報を追加し、Djangoのテンプレート

私はジャンゴきを追加するためのテンプレートでそれを使用したい、それを使用以下のような形式:

class MyForm(forms.Form): 
    integer = forms.IntegerField(
     help_text='Please enter your favorite integer number', 
     label='Favorite integer', 
     widget=forms.TextInput(attrs={'class':'input-xlarge'})) 
    decimal = forms.DecimalField(
     min_value=Decimal('0.0001'), 
     decimal_places=4, 
     help_text='Please enter your favorite decimal number', 
     label='Favorite decimal', 
     widget=forms.TextInput(attrs={'class':'input-xlarge'})) 
    ==> here I would like to say: decimal will have a new property 

は、私は、各フィールドの上にループを使用して、テンプレートにMyFormをレンダリングしています:

{% for item in form.visible_fields %} 
    ==> here I would like to test if item has that property to add some html tags 
    {{ item }} 
{% endfor %} 

私はトン外のプロパティ情報を使用したいと私は、ウィジェットのattrsには使用できません。彼は入力タグをレンダリングしました。

私はcreate a custom fieldを使用する必要がありますか?私が使用するすべてのフィールドのカスタムレンダラーを作成するか、私が見逃した簡単な解決策がありますか?


編集:これまでのところ私のソリューションです:(簡易版) メインテンプレート:form_field.htmlで

<form action="/somewhere/" method="post">{% csrf_token %} 
{% include 'form_field.html' with item=form.integer icon="icon-home" %} 
{% include 'form_field.html' with item=form.decimal icon="icon-list-alt" %} 
{% include 'form_field.html' with item=form.another icon="icon-signal" %} 
{% include 'form_field.html' with item=form.again icon="icon-time" %} 
... 

、私はTwitter's Bootstrap input-prepend divを使用してフィールドをレンダリング:

<div class="control-group"> 
    <label class="control-label" for="{{ item.name }}">{{ item.label }}</label> 
    <div class="controls"> 
    {% if icon %} 
     <div class="input-prepend"> 
     <span class="add-on"><i class="{{ icon }}"></i></span> 
    {% endif %} 
     {{ item }} 
     <p class="help-block">{{ item.help_text }}</p> 
    {% if icon %} 
    </div> 
    {% endif %} 
    </div> 
</div> 

すべて私は、エラーを起こしやすいすべてのフィールドを列挙するのではなく、ループを使用してメインテンプレートを単純化することを望んでいます。だから私は、テンプレートからフォーム定義にその 'icon-home'プロパティを移動して、すべての属性を同じ場所(特定のウィジェットattrsはすでにフォームにあります)に配置したいと考えています。 理想的には、メインテンプレートで私が持っているでしょう:

{% for item in form.visible_fields %} 
    {% include 'form_field.html' %} 
{% endfor %} 

を、私はそれはDjangoの原則(サイトの外観はない形で、テンプレートにする必要があります)の誤解とみなすことができる理解...

+0

達成しようとしていることを詳しく説明できますか? – tamakisquare

+0

Paulのレスポンスに対するコメントにいくつかの精度を追加しました。はっきりしていますか? – Labarbiche

+0

次回は、質問に追加情報を追加するときに、説明のように、コメントではなく元の投稿に追加してください。そうすれば、あなたはすべての情報を1か所で見ることができます。もちろん、コメントには書かれていない豊富な書式設定機能を使って情報をより良く提示することができます。 – tamakisquare

答えて

5

カスタムフォームフィールドを見てみましょう+ 多重継承 + aアイコンクラス名を格納するクラス

まず、アイコンクラス名を取得するクラスを定義しましょう。私たちは、IconNameそれを呼び出します:

class IconName(object): 
    def get_icon_name(self): 
     return self._icon_name 
    def set_icon_name(self, value): 
     self._icon_name = value 
    icon_name = property(get_icon_name, set_icon_name) 

あなたが使用する各フォームフィールドのタイプにカスタムフィールドタイプを思い付くする必要があります。ここでIntegerFieldの仕組みを説明します。カスタムフィールドクラスは元のdjangoフォームフィールドクラス(この場合はIntegerField)とIconNameクラスから継承する必要があります。

class CustomCharField(CharField, IconName): 
    pass 

フォームに必要なすべてのカスタムフォームフィールドの種類を定義したら、それらを使用してフォームを更新します。次は、フォームの__init__()で各フォームフィールドのicon_nameを初期化する必要があります:あなたのテンプレートで

def __init__(self, *args, **kwargs): 
    super(forms.Form, self).__init__(*args, **kwargs) 
    self.fields['integer'].icon_name = 'icon-home' 
    ... 

、あなたが行うことができます:

{% for item in form.visible_fields %} 
<div class="control-group"> 
    <label class="control-label" for="{{ item.name }}">{{ item.label }}</label> 
    <div class="controls"> 
    {% if item.field.icon_name %} 
     <div class="input-prepend"> 
     <span class="add-on"><i class="{{ item.field.icon_name }}"></i></span> 
    {% endif %} 
     {{ item }} 
     <p class="help-block">{{ item.help_text }}</p> 
    {% if item.field.icon_name %} 
    </div> 
    {% endif %} 
    </div> 
</div> 
{% endfor %} 

(私はこれを自分で試していないが、それは動作するはずです私があなたを正しく理解していると仮定して)

+0

私の問題の良い解決策に見えます。フィールドにプロパティを明示的に追加し、それをテンプレートで使用します。私はあなたに知らせようとします。ありがとう。 – Labarbiche

+1

私はあなたのソリューションに少し微調整を加えました。icon_nameは 'item.icon_name'ではなく' item.field.icon_name'でテンプレートにアクセスでき、フォームの '__init __()'にforms.Formの初期化がありませんでした'super(forms.Form、self).__ init __(* args、** kwargs)')、これはフォームのフィールドdictを作成します。あなたの回答を編集しました。私の問題のあなたの仕事の多くの多くのありがとう!!!!! – Labarbiche

+0

@Labarbiche - 私はあなたの質問に役立つことができたことをうれしく思っています。あなたは私が見逃した部分を取り出して修正することさえできました。それは素晴らしいことです!ハッピーDjango'ing – tamakisquare

-1

ジャンゴシンプルなレンダラーではデフォルトで表示されます。 Djangoのdocumentationから

:フォームが動的である場合は、カスタムイメージの使用については

<form action="/contact/" method="post">{% csrf_token %} 
    {{ form.as_p }} 
    <input type="submit" value="Submit" /> 
</form> 

、Javascriptが解決策になります。フォームモデルは効率的にフォームを作成するように設計された表現なので、フォームモデルはありません。

+0

あなたの答えはありがたいですが、質問に答えることはできません:フォームに余分な情報を追加してテンプレートで使用するにはどうすればいいですか? – Labarbiche

+0

@Labarbicheさて、フォームは外部フォームコードを生成するようには設計されていません。それは本当に単なる表象です。 [widgets](https://docs.djangoproject.com/ja/dev/ref/forms/widgets/)から生成されたフィールドのアスペクトをカスタマイズすることができます。ラベルにというタグを入力して画像を使用することはできますか?知りません。 – Paul

+0

はい、あなたはまったく正しいです、フォームはhtmlを処理するべきではありません。私は何をしたいのかを明確にしなければならないと思います:Twisterのブートストラップを使って、私のフィールドのいくつかに「prepend」アイコンをつけたい、そのようなhtmlコードを使用します: '

' – Labarbiche

0

警告:私はちょうどPythonとDjangoを使い始めています。

これは、あなたが始めるのに役立つかどうかを確認してください:

class MyCustomTextInput(forms.widgets.TextInput): 
    def render(self, name, value, attrs=None): 
     original_html = super(MyCustomRender,self).render(name, value, attrs) 
     icon_html = "<img src='/img.png' />" 
     return "%s%s" % (icon_html,original_html) 

class MyForm(ModelForm): 
    myfield = MyCustomTextInput() 

私は、これはのような出力を生成すると信じて:

<img src='/img.png' /><input type="text" ... /> 

https://github.com/django/django/blob/master/django/forms/widgets.py

+0

このソリューションをありがとう。フォーム自体にHTMLを微調整するのはあまり実用的ではないと思います。私はhtmlがテンプレートで微調整されているソリューションを好む。 – Labarbiche

関連する問題