2011-12-19 116 views
3

我有一個表單,我想輸出爲自定義HTML。我forms.py:django自定義窗體選擇標記

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 - 固定錯字。 – 2011-12-19 22:00:55

+0

這裏你有一個很好的起點:http://tothinkornottothink.com/post/10815277049/django-forms-i-custom-fields-and-widgets-in-detail – maazza 2013-11-20 11:27:49

回答

1

爲了更改Django呈現列表項的方式,您需要重寫該字段的小部件。

請參閱文檔中的Customizing widget instances

Overriding the default field types or widgets

最後,如果這不能給你足夠的控制,你可以編寫自己的自定義小部件。以下是使用鍵值對的example of a custom widget。但是,您應該關注的唯一部分是render()方法。您可以擴展內置列表小部件,覆蓋render()方法並使其吐出所需的html。

+0

是的 - 這幫助了很多。我選擇了自定義小部件,它可以根據需要對html進行儘可能多的控制。 Widget.attrs參數證明特別有用。 – 2011-12-20 16:50:25

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>