【问题标题】:How to Stop Django ModelForm From Creating Choices for a Foreign Key如何阻止 Django ModelForm 为外键创建选择
【发布时间】:2014-09-17 20:59:41
【问题描述】:

我有一个 Django 模型,其中包含一个包含大约 50,000 条记录的表的外键。我正在使用 Django forms.ModelForm 创建一个表单。问题是我只需要外键指向的表中记录的一小部分。

我能够在 init 方法中创建选择的子集。如何防止 ModelForm 创建初始选择集?

我尝试在 Meta 方法中使用 widgets 参数。但是 Django 调试工具栏显示数据库仍在被命中。

谢谢

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    自动生成的ModelChoiceField 将其queryset 初始化为默认值。该小部件不在您应该自定义 queryset 属性的位置。

    手动定义ModelChoiceField,将其queryset初始化为空。请记住将ModelChoiceField 命名为与自动生成的名称相同,并记住在fields 元组中提及该字段。现在可以在构造函数中设置queryset,避免数据库被命中两次。

    如果你很幸运(你可能是,请测试一下),queryset 在构造过程中没有被评估,在这种情况下,不需要手动定义ModelChoiceField

    class YourModelForm(ModelForm):
        your_fk_field_name = forms.ModelChoiceField(queryset=YourModel.objects.none())
    
        class Meta:
            model = YourModel
            fields = ('your_fk_field_name', .......)
    
        def __init__(self, *args, **kwargs):
            super(YourModelForm, self).__init__(*args, **kwargs)
            self.fields['your_fk_field_name'].queryset = ....
    

    【讨论】:

    • 谢谢。我测试了你的代码。效果很好。需要注意的一件事是最后一行的属性是“queryset”而不是“choices”。
    • 你说的很对,选择是后来从queryset计算出来的,所以这里手动设置choices充其量是多余的。
    猜你喜欢
    • 2015-09-24
    • 1970-01-01
    • 2012-04-23
    • 2018-10-07
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    相关资源
    最近更新 更多