0

さまざまな層のユーザーが入力できる単一の ModelForm があるとします。管理者はそのフォームの任意のフィールドを編集できます。しかし、他のユーザーのために、特定のフィールドを事前に定義し、読み取り専用および/または非表示にする必要があります。

CBV のget_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 に答える