2

Django 文档说,当在表单上使用 ModelChoiceField 并且表单设置为 required=False 并且模型设置为 blank=True 除了没有默认值之外,那么我应该在我的选择标签中收到一个免费的空选项。我不是。对我为失去空洞的选择所做的一切有什么想法吗?

模型.py

class Location(models.Model):
    location_name = models.CharField(max_length=50, blank=True)
    address = models.CharField(max_length=50)
    active = models.BooleanField(default=True)

    def __unicode__(self):
        return self.location_name

表格.py

class CalcForm(forms.Form):
    startAddr = forms.ModelChoiceField(queryset=Location.objects.all(), required=False)
    waypoint1 = forms.ModelChoiceField(queryset=Location.objects.all(), required=False)
    waypoint2 = forms.ModelChoiceField(queryset=Location.objects.all(), required=False)
    ...
    endAddr = forms.ModelChoiceField(queryset=Location.objects.all(), required=False)

模板.html

<form action="../calcview" method="get">{% csrf_token% }
<label>
    <div>Start Address</div>
    <select name="startAddr">
        {% for location in form.fields.startAddr.queryset %}
            <option value = "{ location.location_name }">{{location.location_name}}/option>
        {% end for %}
    </select>
...
</form>
4

3 回答 3

5

如果您允许 django 表单自动呈现表单字段,您只会获得“免费”空选项。因为您自己在模板中渲染它(我不知道您为什么要这样做......)您需要自己添加空选择:

<select name="startAddr">
    <option value="">-----------</option>
    {% for location in form.fields.startAddr.queryset %}    
        <option value = "{ location.location_name }">{{location.location_name}}</option>
    {% end for %}
</select>

您可以通过允许 django 表单为您呈现它来测试它:

<div>Start Address</div>
{{ form.startAddr }}
于 2013-08-30T18:43:38.813 回答
2

您可以empty_label在您的ModelChoiceField.

startAddr = forms.ModelChoiceField(empty_label='---------', queryset=Location.objects.all(), required=False)

然后将表单域渲染到模板中。

{{ form.startAddr }}

https://docs.djangoproject.com/en/2.1/ref/forms/fields/#django.forms.ModelChoiceField.empty_label

于 2018-10-01T13:07:09.283 回答
1

我知道,您半年前问过,但我想我还是发布了另一个答案。因为我认为有一个更优雅的解决方案,它使用empty_label您可以在表单中定义的“”。

form.fields.startAddr.empty_label您可以通过模板或form.startAddr.field.empty_label在模板中访问此 empty_label 属性。所以你可以像这样包含它:

<select id="{{ form.fields.startAddr.id_for_label }}" name="{{ form.fields.startAddr.html_name }}">
    <option value="">{{ form.fields.startAddr.empty_label }}</option>
    {% for location in form.fields.startAddr.queryset %}
        <option value="{{ location.location_name }}">{{ location.location_name }}/option>
    {% endfor %}
</select>

我想知道您是否真的不想{{ location.id }}用作价值?还是location_name独一无二的?因为它甚至可能是空的,所以自动生成的id作为参考可能会更好。

如您所见,我还替换name="startAddr"了表单对象为每个字段提供的信息:id="{{ form.fields.startAddr.id_for_label }}" name="{{ form.fields.startAddr.html_name }}. 使用这些变量应该使您的模板代码更加灵活和健壮。

有关详细信息,请查看 Django 文档:

于 2014-03-14T15:25:59.100 回答