如何从ModelChoiceField响应中编写视图?

时间:2013-06-16 23:12:36

标签: django django-forms django-views

我是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文档并在此处搜索论坛并尝试了几种方法后,我比以往更加困惑。

2 个答案:

答案 0 :(得分:1)

根据您对class season_choice的使用,以及声明forms.Form类,您似乎在Metaforms.Form中混合使用。

如果您需要与模型默认值不同的表单窗口小部件,则可以使用MetaModelForm类中覆盖它。使用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>
相关问题