0

ownerこのオブジェクトを所有するユーザーを参照する外部キーを持つDjangoモデルがあります。他のユーザーがこれらのオブジェクトを編集できるようにするために、私は現在、を使用してforms.ModelFormいます。これはこれまでのところ正常に機能します。

しかし、私は所有者と所有者だけが所有するオブジェクトの所有者を変更できるようにしたいことを知っています(なんと所有権です!:)。したがって、私は次のことを試みました:

class FolderForm(forms.ModelForm):
    def __init__(self, user, *args, **kwargs):
        if kwargs.get("instance", False):
            if user == kwargs["instance"].owner:
                self._meta.fields += ("owner",)

        super(FolderForm, self).__init__(*args, **kwargs)

    class Meta:
        model = Folder
        fields = (
            "name",
            "description",
        )

ただし、Djangoはメタクラスマジックを使用してモデルのフィールドを設定するため、これは機能しません。これは、サブクラス__init__が呼び出される前に行われるようです。

誰かがこのようなことをしたことがありますか?

4

2 に答える 2

1

普段はクロージャを使うのが好きです

def make_form(exclude_user=True):
    class Form(forms.ModelForm):
        class Meta:
            model = Folder         
            exclude = ['user'] if exclude_user else None
    return Form

form_cls = make_form(request.user != folder.owner)
于 2012-04-20T14:38:26.530 に答える
0

2つのフォームを作成してみませんか。

データを所有していない(一口)ユーザーの所有者を除外し、ビューで単純なifステートメントを実行するもの:

if request.user == Model.owner:
    form = OwnerForm
else:
    form = OthersForm

可能な限りシンプルに保つことで、巨大な勝利を収めることができます。

于 2012-04-20T14:27:44.477 に答える