django自定义表单选择标记

时间:2011-12-19 20:56:59

标签: django forms

我有一个表单,我想输出为自定义HTML。我的forms.py:

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的选择字段的输出?

2 个答案:

答案 0 :(得分:8)

我想你可以自己构建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>

答案 1 :(得分:2)

为了改变Django呈现列表项的方式,您需要覆盖该字段的小部件。

请参阅文档中的Customizing widget instances

Overriding the default field types or widgets

最后,如果这不能给你足够的控制权,你可以编写自己的自定义小部件。这是一个用于处理键值对的example of a custom widget。但是,您应该关注的唯一部分是render()方法。您可以扩展内置列表小部件,覆盖render()方法并使其吐出您想要的html。