Skip to main content
 首页 » 编程设计

python之Django之缺少 ModelChoiceField 空选择

2025年05月04日40jackei

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

模型.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> 

请您参考如下方法:

如果您允许 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 }}