【问题标题】:django ModelMultipleChoiceField queryset/filter for objects already associateddjango ModelMultipleChoiceField 查询集/过滤器已关联的对象
【发布时间】:2011-05-19 08:54:52
【问题描述】:

我有一个 Profile 对象,它与 Category 具有多对多关系


class Profile(models.Model):
    . . . 
    category = models.ManyToManyField(Category, blank=True)

在我的表单中,我想显示一个仅包含与个人资料关联的类别的复选框 下面的代码将显示所有类别。


class ProfileForm(ModelForm):
    . . .
    category = forms.ModelMultipleChoiceField(Category.objects.all(),
                  widget=forms.CheckboxSelectMultiple())

如何编写查询集以便仅显示与配置文件关联的类别? 我有这个的变体:


    category = forms.ModelMultipleChoiceField(Category.objects.filter(id__in=Profile.category.all()), widget=forms.CheckboxSelectMultiple())

有这个错误:'ReverseManyRelatedObjectsDescriptor'对象没有属性'all'

【问题讨论】:

  • 没关系:我必须在视图中定义查询集。我猜坐与运行时变量 form.fields["category"].queryset = Category.objects.filter(profile=profile) 有关

标签: django forms filter django-queryset


【解决方案1】:

据我所知,关系“类别”只能与 Profile instance 关联(给出关联的类别),而不能与 Profile 类本身关联。这就是您收到错误消息的原因。

如果您将示例中的 Profile 替换为实际的 Profile 实例(我读到的是您实际尝试实现的),效果会更好。

category=forms.ModelMultipleChoiceField(
    Category.objects.filter(id__in=your_profile_instance.category.all()),
    widget=forms.CheckboxSelectMultiple()
)

或者只是

category=forms.ModelMultipleChoiceField(
    queryset=your_profile_instance.category.all()),
    widget=forms.CheckboxSelectMultiple()
)

我是否正确理解了您的问题?

【讨论】:

    【解决方案2】:

    哇,这是 10 年前提出的问题。但我的想法可能对将要审查此问题的开发人员有用。我也遇到过类似的挑战。

    简单的方法是注释掉这个:

    #category=forms.ModelMultipleChoiceField(
    #    Category.objects.filter(id__in=your_profile_instance.category.all()),
    #    widget=forms.CheckboxSelectMultiple()
    #)
    

    大声笑,然后在下面,在列出字段后添加:

    widgets = {
         'category': forms.CheckboxSelectMultiple,
        }
    

    是的....

    https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method

    【讨论】:

    猜你喜欢
    • 2022-11-08
    • 1970-01-01
    • 2018-12-19
    • 2014-01-08
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    相关资源
    最近更新 更多