如何过滤 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,如何在模板中动态设置 ModelForm 字段值?