如何过滤 Django ModelForm 中的 ManyToManyField 选项?

Posted

技术标签:

【中文标题】如何过滤 Django ModelForm 中的 ManyToManyField 选项?【英文标题】:How do I filter ManyToManyField choices in a Django ModelForm? 【发布时间】:2012-04-29 16:52:44 【问题描述】:

我想在我的 ModelForm 中过滤 ManyToManyField 选项:

class MyForm(forms.ModelForm):
    class Meta:
        model = Entity
        fields = ['parent_entities']

    def __init__(self, *args, **kwargs):
        self.root_entity = kwargs.pop('root_entity')
        self.Meta.fields['parent_entities'].queryset = Entity.objects.filter(root_entity=self.root_entity)
        super(MyForm, self).__init__(*args, **kwargs)

我尝试了很多我见过的不同代码,但都没有奏效。

我想我的问题是我无法获得这个“parent_entities”字段。 使用此代码,我有错误:

list indices must be integers, not str

【问题讨论】:

【参考方案1】:
def __init__(self, *args, **kwargs):
   # First pop your kwargs that may bother the parent __init__ method
   self.root_entity = kwargs.pop('root_entity')
   # Then, let the ModelForm initialize:
   super(MyForm, self).__init__(*args, **kwargs)
   # Finally, access the fields dict that was created by the super().__init__ call
   self.fields['parent_entities'].queryset = Entity.objects.filter(root_entity=self.root_entity)

【讨论】:

我之前已经尝试过了,但是我收到了这个错误信息:AttributeError 'MyForm' object has no attribute 'fields' 对,也许你应该在访问 MyForm.fields 之前调用父 init 如果这样做,我会遇到以下错误(这是有道理的):TypeError __init__() got an unexpected keyword argument 'root_entity'。 (实际上我没有看到您在最初的答案中更改了行的顺序) 对,然后在调用 init 之前弹出 kwargs ... 答案已更新 是的,我的错!感谢您的回答!

以上是关于如何过滤 Django ModelForm 中的 ManyToManyField 选项?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 的 ModelForm 中使用请求

Django:按用户过滤 ModelChoiceField

如何在 django modelform 中的必填字段后添加 *?

使用 Django,如何在模板中动态设置 ModelForm 字段值?

Django ModelAdmin 从 ModelForm 获取查询集

基于下拉值选择显示Django ModelForm中的链接