【问题标题】:Django forms and querysetsDjango 表单和查询集
【发布时间】:2015-11-30 21:33:55
【问题描述】:

假设我需要过滤多选框中的可用选项。

在我看来,我有:

class ArticleCheckbox(forms.ModelForm):
    article= forms.ModelMultipleChoiceField(queryset=Article.objects.all(),required=False, widget=forms.CheckboxSelectMultiple)
    class Meta:
        model = Book
        fields = ('m2m_article',)

。 在我看来,我将分配:

articleform = ArticleCheckbox()
articleform.fields["m2m_article"].queryset = Article.objects.filter(category = "Animals")

视图中查询集的分配如何影响类 (Article.object.all()) 中的查询集? 它会覆盖吗?我不这么认为。

我想覆盖查询集。我该怎么做?

【问题讨论】:

    标签: django django-forms django-views


    【解决方案1】:

    这行得通吗?

    article=forms.ModelMultipleChoiceField(queryset=Article.objects.all().filter(category = "Animals"),required=False, widget=forms.CheckboxSelectMultiple)

    直接在模型中。还是要将过滤留给视图做不同的事情?

    【讨论】:

    • 我需要在类构建完成后在视图中进行。我需要不同的过滤器。上面的静态例子只是一个例子。我的代码过滤器是动态的。
    • 我能想到的最佳解决方案是通过过滤器标准来构建表单。但是即使我将变量传递给模型表单,我也无法在构造之前使用它。这意味着我不能像您的示例中那样动态设置过滤器。还是我错了?
    • 我同意 Sayse 关于向模型提供方法预请求的说法。
    【解决方案2】:

    你这样做的方式是正确的,除了你分配了而不是ArticleCheckBox的实例

    articleform = ArticleCheckbox()
    

    当表单被初始化时,它会被赋予一个默认查询集,而您正在覆盖它,初始查询集将永远不会查询数据库,因为此时不需要检索任何数据。

    【讨论】:

    • 注意:这个答案的附带条件是您只打算从一个函数中执行此操作,如果您想要此默认行为,那么可以作为您的设置默认值或在初始化程序中执行此操作
    • 感谢您的提示,我更正了示例中的错字。
    • 当我进行这样的覆盖时,HTML 仅反映视图中的过滤器。不幸的是,POST 响应(未清理)具有所有选项。没有最重要的过滤器!这是非常不幸的,因为当应用 object.save() 时,所有未显示的选项都在数据库中被取消选择。
    • @caliph - 这就是我在上一段(句子)中的意思,您应该提供一个 __init__ 方法并在其中设置过滤器,或者在发布之前必须调用的其他方法返回响应
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 2018-06-01
    • 1970-01-01
    相关资源
    最近更新 更多