2011-12-19 15 views
3

カスタムHTMLとして出力したいフォームがあります。私forms.pyは:djangoカスタムフォームselectタグ

from django import forms 

from cdrs.models import Localitymayor 

class SearchForm(forms.Form): 
    genus = forms.CharField(max_length=100) 
    species = forms.CharField(max_length=100) 
    island_group = forms.ModelChoiceField(queryset=Locality.objects.values_list('islandgroup', flat=True).distinct('islandgroup').exclude(islandgroup="n/a").order_by('islandgroup')) 
    island_name = forms.ModelChoiceField(queryset=Locality.objects.values_list('islandname', flat=True).distinct('islandname').exclude(islandname="n/a").order_by('islandname')) 

Django documentationではそれがどのように出力するカスタムHTMLを示しています。しかし、明らかに以下のテンプレートコードは、選択フィールドでは動作しません:

<form action="/search/" method="post"> 
{{ form.non_field_errors }} 
<div class="fieldWrapper"> 
    {{ form.genus.errors }} 
    <label for="id_genus">Genus:</label> 
    {{ form.genus }} 
</div> 
... 
<div class="fieldWrapper"> 
    {{ form.island_group.errors }} 
    <label for="id_island_group">Island Group:</label> 
    {{ form.island_group }} 
</div> 
... 
</form> 

は、どのように私は私のModelChoiceFieldsのための選択フィールドの出力を制御するのですか?

+0

oops - typoが修正されました。 –

+0

ここにあなたは良い出発点があります:http://tothinkornottothink.com/post/10815277049/django-forms-i-custom-fields-and-widgets-in-detail – maazza

答えて

1

Djangoがリストアイテムをレンダリングする方法を変更するには、そのフィールドのウィジェットをオーバーライドする必要があります。

ドキュメントのCustomizing widget instancesを参照してください。

およびOverriding the default field types or widgets

最後に、これで十分なコントロールが得られない場合は、独自のカスタムウィジェットを作成できます。キーと値のペアを扱うためのexample of a custom widgetがあります。しかし、あなたが気にする必要があるのは、render()メソッドだけです。あなたは組み込みのリストウィジェットを拡張し、render()メソッドをオーバーライドし、あなたが望むhtmlを吐き出すことができます。

+0

はい - これは助けになりました。ウィジェットをカスタマイズして、必要なだけhtmlをコントロールできるようにしました。 'Widget.attrs'引数は特に有用であることが判明しました。 –

6

自分でhtmlを構築できるとします。

<select name="{{ form.island_group.name }}"> 
    {% for instance in form.island_group.field.queryset %} 
     <option value="{{ instance.pk }}">{{ instance.name }} yarr</option> 
    {% endfor %} 
</select>