2

ユーザーフィールドを持つモデルがいくつかあります。

self.userこの目的のために、インスタンス (ビューでフォームに提供される) を追加するフォーム mixin を作成したいと思います。出来ますか ?

これが例です

class UserFormMixin(object):
    """Removes user instance from kwargs and adding it to object"""
    def __init__(self, *args, **kwargs):
        super(UserFormMixin, self).__init__(*args, **kwargs)
        self.user = kwargs.pop('user')

    def save(self, **kwargs):
        obj = super(UserFormMixin, self).save(commit=False)
        obj.user = self.user
        if kwargs['commit']:
            return obj.save()
        else:
            return obj

私が達成したいこと:

class SomeFormWithUserField(UserFormMixin, ModelForm):
    class Meta:
        model = SomeModelWithUserField
        fields = ['fields without user']

    def save(self, **kwargs):
        data = super(SomeFormWithUserField, sefl).save(commit=False)
        #data already with user prepended
        #do some other stuff with data
        if kwargs['commit']:
            return data.save()
        else
            return data

class SomeOtherFormWithUser(UserFormMixin, ModelForm):
    class Meta:
        model = SomeOtherModel
        fields = ['some fields without user']

# no need to save here.. standard model form with user prepended on save()

問題は、UserFormMixin がモデル インスタンスを認識していないことですか? それとも私はここで間違っていますか?私はいくつかの問題を抱えています..「コミット」kwargsキーエラー..またはオブジェクトが保存されていない..

4

2 に答える 2

6

あなたは近いです、あなたはいくつかの論理エラーを持っています. まず、メソッドをオーバーライドModelFormするには、ミックスインが から継承する必要がありますModelForm

class UserFormMixin(forms.ModelForm):
    ...

UserFormMixin次に、それを継承するすべてのフォームは、ではなくを継承しModelFormます。

class SomeOtherFormWithUser(UserFormMixin):
    ...

次に、__init__メソッドのオーバーライドが正しくありません。渡されるすべての引数と kwargs を受け入れる必要があります。

def __init__(self, *args, **kwargs):
    ...

save最後に、サブクラスでメソッドを再度オーバーライドしないでください。技術的には何も害はないと思いますが、とにかくコードを繰り返す場合、継承のポイントは何ですか? Ifが null 許容でない場合は、いつでも if ブロックを追加して、モデルに追加する前にuserif ブロックを確認できます。self.user is not Noneもちろん、 nullable でない場合、モデルはとにかくuser保存しない可能性があります。self.user

于 2012-06-13T14:49:23.597 に答える
1

これはうまくいくようです。ありがとうクリス!これをより適切にコーディングできる場合は、お知らせください。

class UserFormMixin(forms.ModelForm):
    """Removes user instance from kwargs and adding it to object"""
    def __init__(self, *args, **kwargs):
        super(UserFormMixin, self).__init__(*args, **kwargs)
        self.user = kwargs.pop('user')

    def save(self, commit=True):
        obj = super(UserFormMixin, self).save(commit=False)
        obj.user = self.user
        if commit:
            return obj.save()
        else:
            return obj


class SomeFormWithUserField(UserFormMixin):
    class Meta:
        model = SomeModelWithUserField
        fields = ['fields without user']

    def save(self, **kwargs):
        data = super(SomeFormWithUserField, sefl).save(commit=False)
        #data already with user prepended
        #do some other stuff with data
        # self.send_mail() f.e.
        return data.save()

class SomeOtherFormWithUser(UserFormMixin):
    class Meta:
        model = SomeOtherModel
        fields = ['some fields without user']
# this will work too
于 2012-06-13T17:09:09.873 に答える