0

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

使用我的 CBVget_form_kwargs方法,我已经让表单知道提出它的用户,并且在它的__init__方法中我做出相应的反应,调整表单的exclude、字段requiredinitial属性;然后,在我看来form_valid,我会进一步执行这些价值观。但是,坦率地说,我不确定我所做的每一个操作是否真的需要,也不确定是否有一些我不知道的漏洞。

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

4

1 回答 1

3

假设没有很多组合,我会创建一个不同的表单来满足用户的不同需求。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.
于 2013-06-29T17:05:35.417 回答