1

を編集しようとしていますdjango.contrib.auth.forms.UserChangeForm。基本的には、auth_user のユーザー編集ページです。

https://github.com/django/django/blob/master/django/contrib/auth/forms.py

ソースコードによると、フォームにはsave()メソッドがないので、継承する必要がありforms.ModelFormますよね?

完全なコードについては、こちらを参照してください

class MyUserAdminForm(forms.ModelForm):
    class Meta:
        model = User

    def __init__(self, *args, **kwargs):
        super(MyUserAdminForm, self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        if instance and instance.id: # username and user id
            ... the rest of the __init__ is setting readonly fields

    .... some clean methods .....

    def save(self, *args, **kwargs):
        kwargs['commit'] = True
        user = super(MyUserAdminForm, self).save(*args, **kwargs)
        print user.username
        print 'done'
        return user

保存すると、 と表示され'UserForm' object has no attribute 'save_m2m'ました。私はかなりグーグルで検索し、使用しようとしましadd()たが、うまくいきませんでした。この動作の原因は何ですか?

問題は、2 つのprintステートメントが出力されることです。しかし、値はデータベースに保存されませんでした。2行目はもう1回セーブしただろうと思っていました。

ありがとう

4

1 に答える 1

4

行を削除し、kwargs['commit'] = True何が起こるかを確認します。

Django Admin はwhen is , hereform.save_m2m()にフックされている を呼び出します。を無条件にオーバーライドすると、が壊れてエラーが発生します。実際に影響を受けるロジックは次のとおりです。formcommitFalsekwargs['commit'] = Truesetattrsave_m2m()formno attribute

def save_form(self, request, form, change):
     """
     Given a ModelForm return an unsaved instance. ``change`` is True if
     the object is being changed, and False if it's being added.
     """
     return form.save(commit=False)

バージョンのform.save()オーバーライドcommit=Falseが無条件に行われていることがわかる可能性があるため、Django Adminは呼び出さcommit=Trueれたと信じているため続行できず、呼び出す必要があります。form.save(commit=False)form.save_m2m()

ドキュメントを参照ます:

commit=False を使用する別の副作用は、モデルが別のモデルと多対多の関係にある場合に見られます。モデルに多対多の関係があり、フォームを保存するときに commit=False を指定した場合、Django は多対多の関係のフォーム データをすぐに保存できません。これは、インスタンスがデータベースに存在するまで、インスタンスの多対多データを保存できないためです。

この問題を回避するために、commit=False を使用してフォームを保存するたびに、Django は save_m2m() メソッドを ModelForm サブクラスに追加します。フォームによって生成されたインスタンスを手動で保存した後、save_m2m() を呼び出して多対多のフォーム データを保存できます。

于 2012-07-09T09:35:40.747 に答える