我有一个表单,我想输出为自定义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的选择字段的输出?
答案 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。