【问题标题】:Removing a fields from a dynamic ModelForm从动态 ModelForm 中删除字段
【发布时间】:2011-01-31 16:04:58
【问题描述】:

在 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是模型中定义的每个字段都会显示在模板上。
如果不需要它们,我想将它们从表单中删除:
示例:如果用户对模型公司没有权限,则不会在模板中呈现的表单中使用它。

问题是您必须将字段列表放在具有 fieldsexclude 属性的表单的 Meta 类中,但我不知道如何动态管理它们。

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

【问题讨论】:

    标签: django dynamic field modelform


    【解决方案1】:

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

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

    【讨论】:

    • 是的,很明显!!!!只需要定义 Meta 类中的所有字段,然后如果没有用就删除...非常感谢!
    • 如果您在 ModelAdmin 中指定了字段集,这将不起作用。
    • @NathanKeller 又快又脏:self.fields['field_to_hide'] = forms.CharField(required=False, widget=forms.HiddenInput())
    • 在调用 init 之后修改表单对我来说总是有点 hackish。你必须非常小心你做什么! (仍在 2018 年!)
    猜你喜欢
    • 1970-01-01
    • 2018-11-08
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多