0

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

4

2 回答 2

1

看起来你正在混合forms.Form并基于你的使用forms.ModelForm但也声明一个类。class season_choiceforms.FormMeta

如果您需要与模型默认值不同的表单小部件,Meta如果使用ModelForm. 使用 ModelForms 时,最好明确列出要显示的字段,以便默认情况下不添加将来的字段(可能敏感的字段)。

class SeasonForm(forms.ModelForm):
    class Meta:
        model = Season
        fields = ['year']
        widgets = {
            'year': forms.widgets.Select(),
        }

Django 模型还有一个 Meta 类,它允许您提供默认排序

class Season(models.Model):
    year = ...

    class Meta:
        ordering = ['-year']

如果您不希望整个 Model 类具有该顺序,您可以在视图中更改它或创建代理模型,然后在您的表单中使用model = SeasonYearOrdering.

class SeasonYearOrdering(Season):
    class Meta:
        ordering = ['-year']
        proxy = True

另一个有趣的项目是模板中的硬编码 url。你可以在你的urls.py 名字中给出网址。然后在您的模板中,您可以引用这些名称,这样如果您的urls.py路径发生更改,您的模板将引用名称而不是硬编码路径。

所以:

<form action="/season_detail/{{ choice.year }}" method="get">

变为(season_detail 是 urls.py 中的名称):

<form action="{% url "season_detail" choice.year %}" method="get">
于 2013-06-17T00:35:47.650 回答
0

您可以通过添加to_field_name='year'到表单中的选项 ModelChoicefield 来更改选项的值。

所以你会得到

<option value="1981">1981</option>
<option value="1982">1982</option>
<option value="1983">1983</option>
于 2013-06-17T02:49:07.143 回答