使用 Django 使用 ModelChoiceField 和 queryset 参数

Posted

技术标签:

【中文标题】使用 Django 使用 ModelChoiceField 和 queryset 参数【英文标题】:Using ModelChoiceField and queryset argument using Django 【发布时间】:2013-09-15 11:46:03 【问题描述】:

我想创建一个简单的 html <select> 列表。

models.py 中,我定义了一个Member 模型,其中包含有关每个User 的大量详细信息。一个细节是一年,即 2000 年、2001 年等。在会员注册表中,我想要一个 <select> 列表,其中可以选择可以追溯到 20 年的年份(随着时间的推移而动态变化)。

我从this post 了解到,我应该使用带有查询集参数的ModelChoiceField

似乎我需要创建另一个专用于动态列表的模型,但我认为这是不正确的,因为它确实不需要在数据库中,因为每次加载表单时都可以计算它。

那么我应该在 queryset 属性中添加什么?理想情况下,我想创建获取当前年份的简单函数,创建某种类型的数组,即查询集。我对 python 没有那么丰富的经验,所以这可能是一个愚蠢的问题。

对丹尼尔·罗斯曼的回应:

是的,这更有意义。谢谢!但是,我确实必须将日期时间线修改为:

import datetime
year = datetime.date.today().year

【问题讨论】:

【参考方案1】:

您误解了该问题的答案,或者我对该答案的评论。如果 choice 需要从模型中获取其值,您只会使用 ModelChoiceField - 我的评论只是指出您可以这样做,无论 form 本身是基于一个模型。但是在您的情况下,选择与任何模型都无关,因此 ModelChoiceField 是错误的选择。

一个标准的 ChoiceField 是去这里的方式:

class MemberRegistrationForm(forms.ModelForm):
    year = forms.ChoiceField(choices=[])

    def __init__(self, *args, **kwargs):
        super(MemberRegistrationForm, self).__init__(*args, **kwargs)
        year = datetime.datetime.now().year
        self.fields['year'].choices = [(i, i) for i in range(year-20, year+1)]

【讨论】:

以上是关于使用 Django 使用 ModelChoiceField 和 queryset 参数的主要内容,如果未能解决你的问题,请参考以下文章

使用 azure 作为 Django 的存储后端(使用 django-storages)

如何仅使用 django 作为后端并使用 django-rest-framework 发布

使用 Django 模板和标签而不使用 Django 的其余部分

使用Django返回helloworld

使用Django返回helloworld

使用Django返回helloworld