我是Django表单的新手,我对这些看起来应该非常简单的东西感到困惑。
我想创建一个下拉选择器,用于指导用户查看详细信息页面,每年一个。
在models.py中我有:
class Season(models.Model):
year = models.IntegerField(unique = True, max_length=4, verbose_name = "Season (year)")
…
class season_choice(forms.Form):
choice = forms.ModelChoiceField(queryset=Season.objects.all().order_by('year'), empty_label="Season")
class Meta:
model = Season
在我的模板中:
<form action="/season_detail/{{ choice.year }}" method="get">
{{ season_choice.as_p }}
<input type="submit" value="Go" />
</form>
下拉选择器显示正常,产生的格式如下:
<select id="id_choice" name="choice">
<option selected="selected" value="">Season</option>
<option value="1">1981</option>
<option value="2">1982</option>
<option value="3">1983</option>
…
选择并提交一年,例如1983年,现在需要我/ season_detail /?choice = 3什么时候我喜欢/ season_detail /?choice = 1983
我认为我需要将其写入views.py,但在阅读完Django文档并在此处搜索论坛并尝试了几种方法后,我比以往更加困惑。
答案 0 :(得分:1)
根据您对class season_choice
的使用,以及声明forms.Form
类,您似乎在Meta
和forms.Form
中混合使用。
如果您需要与模型默认值不同的表单窗口小部件,则可以使用Meta
在ModelForm
类中覆盖它。使用ModelForms时,最佳做法是明确列出要显示的字段,以便默认情况下不会添加未来的字段(可能是敏感字段)。
class SeasonForm(forms.ModelForm):
class Meta:
model = Season
fields = ['year']
widgets = {
'year': forms.widgets.Select(),
}
Django模型还有一个Meta类,允许你forms.ModelForm
:
class Season(models.Model):
year = ...
class Meta:
ordering = ['-year']
如果您不希望整个Model类具有该排序,您可以在视图中更改它或创建代理模型,然后在表单中使用model = SeasonYearOrdering
。
class SeasonYearOrdering(Season):
class Meta:
ordering = ['-year']
proxy = True
另一个感兴趣的项目是模板中的硬编码网址。您可以在urls.py
provide a default ordering中提供网址。然后在模板中,您可以引用这些名称,以便在urls.py
路径发生变化时,模板会引用名称而不是硬编码路径。
所以:
<form action="/season_detail/{{ choice.year }}" method="get">
成为(season_detail是来自urls.py的名字):
<form action="{% url "season_detail" choice.year %}" method="get">
答案 1 :(得分:0)
您可以通过将to_field_name='year'
添加到表单中的选择ModelChoicefield来更改选项的值。
所以你会得到
<option value="1981">1981</option>
<option value="1982">1982</option>
<option value="1983">1983</option>