2013-08-30 127 views
1

Django文檔說當在窗體上使用ModelChoiceField時,表單被設置爲required = False,並且模型被設置爲blank = True,除了沒有默認值,那麼我應該會收到一個空的空選項我的選擇標籤。我不是。任何想法,我已經做了什麼,失去了空的選擇?Django - ModelChoiceField空選擇丟失

models.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 

forms.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) 

template.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> 

回答

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 }} 
+0

謝謝,這就是解決方案。 – Joe

0

我知道,你問了半年多前,但我想我反正張貼另一個答案。因爲我認爲有一個更優雅的解決方案使用您可以在表單中定義的「empty_label」。

您可以通過模板中的form.fields.startAddr.empty_labelform.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文檔: