forms.ModelChoiceField的构造函数需要查询集.在请求发生之前,我不知道查询集.蒸馏:

# models.py
class Bar(models.model):
    text = models.TextField()

class Foo(models.Model):
    name = models.CharField()
    bar = models.ForeignKey(Bar)

# forms.py
class FooForm(forms.Form):
    name = forms.CharField()
    text = forms.CharField(widget=forms.TextArea)

    bar = forms.ModelChoiceField(queryset='??????')

我目前正在做的事情:

# forms.py

def get_foo_form_class(bars_queryset):
    class FooForm(forms.Form):
        name = forms.CharField()
        text = forms.CharField(widget=forms.TextArea)

        bar = forms.ModelChoiceField(queryset=bars_queryset)

    return FooForm

然后,我可以使用从url中解析出来的参数和urlconf在视图中调用它,以构造查询集并获取类.这感觉像是用错误的方式做这件事.在Django 有没有一种既定的方式来做这件事?

推荐答案

重写表单的__init__方法并在那里设置查询集.

class FooForm(forms.Form):
    bar = forms.ModelChoiceField(queryset=Bar.objects.none())

    def __init__(self, *args, **kwargs):
        qs = kwargs.pop('bars')
        super(FooForm, self).__init__(*args, **kwargs)
        self.fields['bar'].queryset = qs

Django相关问答推荐

Django的update_or_create失败,尽管指定了kwargs'

如何在Django上创建ManyToMany管理面板?

在Django中使用Generil.ListView类时,分页不起作用

Django测试:如何模拟Django_apps.get_Model()的LookupError

如何在没有此前缀的情况下修复此 django 路径?

Django 仅预取相关模型的最新对象

Django中基于令牌的身份验证

如何查看 Django 调试工具栏?

为什么 django 1.7 会为字段 Select 的变化创建迁移?

Django error:不能分配必须是实例

Django BigInteger自动增量字段作为主键?

更新Django模型对象多个字段的有效方法

在 django 模板中访问元组

无效的块标签: static

有日期时间±无穷大吗?

将 jQuery 脚本添加到 Django 管理界面

Django:验证上传文件的文件类型

如何使 Django 的开发服务器公开?

Heroku & Django:OSError: No such file or directory:'/app/{myappname}/static'

BASE DIR 的绝对路径是什么?