【问题标题】:Django ModelForms: cleanest way to hide fields and enforce defaultsDjango ModelForms:隐藏字段和强制执行默认值的最简洁方法
【发布时间】:2013-06-27 05:50:25
【问题描述】:

假设我有一个模型表单,可以由不同层次的用户填写。管理员可以编辑该表单的任何字段;但对于其他用户,我需要预先定义某些字段,并且是只读和/或隐藏的。

使用我的 CBV 的 get_form_kwargs 方法,我让表单知道提出它的用户,并在其 __init__ 方法中做出相应的反应,调整表单的 exclude 和字段的 @987654324 @ 和 initial 属性;然后,在我看来的form_valid 中,我进一步强制执行这些值。但是,坦率地说,我不确定我所做的每一个操作是否真的需要,也不确定是否有一些我不知道的漏洞。

那么,最好、最干净的方法是什么?

【问题讨论】:

    标签: django django-class-based-views django-forms


    【解决方案1】:

    假设没有很多组合,我会创建一个不同的表单来满足用户的不同需求。然后覆盖def get_form_class 并根据您的需要返回正确的表单。这样可以将不同的用例分开,并在您将来需要在不破坏其他形式的情况下进行更改时提供灵活性。

    # models.py
    class Foo(models.Model):
        bar = model.CharField(max_length=100)
        baz = model.CharField(max_length=100)
        biz = model.CharField(max_length=100)
    
    # forms.py
    class FooForm(forms.ModelForm):  # for admins
        class Meta:
            model = Foo
    
    class FooForm(forms.ModelForm):  # users who can't see bar
        boo = forms.CharField()
    
        class Meta:
            model = Foo
            exclude = ['bar']
    
    class FooFormN(forms.ModelForm):  # as many different scenarios as you need
        def __init__(self, *args, **kwargs)
            super(FooFormN, self).__init__(*args, **kwargs)
            self.fields['biz'].widget.attrs['readonly'] = True
    
        class Meta:
            model = Foo
    
    # views.py
    class SomeView(UpdateView):
        def get_form_class(self):
            if self.request.user.groups.filter(name="some_group").exists():
                return FooForm
            # etc.
    

    【讨论】:

    • 这是一种可能性。我曾考虑过这一点,但我没有意识到它实际上确实有意义。
    猜你喜欢
    • 2011-04-04
    • 1970-01-01
    • 2011-02-16
    • 2017-11-13
    • 2014-07-15
    • 2012-02-09
    • 2016-04-18
    • 1970-01-01
    • 2011-05-25
    相关资源
    最近更新 更多