从动态ModelForm中移除字段

10
在ModelForm中,我需要测试用户权限以便他们填写正确的字段:
它被定义为:
class TitleForm(ModelForm):    
    def __init__(self, user, *args, **kwargs):
        super(TitleForm,self).__init__(*args, **kwargs)            
        choices = ['','----------------']
        # company
        if user.has_perm("myapp.perm_company"): 
            self.fields['company'] = forms.ModelChoiceField(widget=forms.HiddenInput(),
                queryset=Company.objects.all(), required=False) 
            choices.append(1,'Company')
        # association
        if user.has_perm("myapp.perm_association")
            self.fields['association'] =
            forms.ModelChoiceField(widget=forms.HiddenInput(),
                queryset=Association.objects.all(), required=False)
            choices.append(2,'Association')
        # choices
        self.fields['type_resource'] = forms.ChoiceField(choices = choices)

    class Meta:
        Model = Title  
这个 ModelForm 已经可以隐藏表单上的每个字段并通过 JavaScript 使它们出现了...
问题在于这个 ModelForm 中定义的每个字段都将显示在模板中。
如果不需要它们,我希望从表单中删除它们:
例如:如果用户对公司模型没有权限,则不会在渲染的表单中使用它。

问题是你必须在表单的 Meta 类中使用 fieldsexclude 属性来放置字段的列表,但我不知道如何动态管理它们。

有什么想法吗?
感谢您提前的任何答复。

1个回答

16

只需从self.fields字典中删除它:

if not user.has_perm("blablabla"):
    del self.fields["company"]

是的,这很明显!!!只需要在元类中定义所有字段,然后删除不必要的字段即可...非常感谢! - Jérôme Pigeot
6
如果在 ModelAdmin 中指定了 fieldset,那么这种方法就行不通。 - Nathan Keller
@NathanKeller 快速而简单的方法:self.fields['field_to_hide'] = forms.CharField(required=False, widget=forms.HiddenInput()) - benzkji
1
在__init__被调用后修改表单总让我感觉有点不正规。你必须非常小心你所做的事情!(即使在2018年仍然如此!) - benzkji

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接