2017-10-25 10 views
1

admin.pyTabularInlineを使用してUserUserPhoneを形成するが、私は唯一のUserモデルの変化を検出することができ、単一の送信ボタンを両方のモデルデータを保存するとき検証Djangoの管理親フォームとインラインデータ

def save_model(self, request, obj, form, change): 
    print "form:",form.changed_data 

しかし、私はUserPhoneモデルデータの変更をチェックする必要があります。これは両方のモデルデータを1回の送信で保存するときも同じです。

Admin.py 

    class UserPhoneInline(admin.TabularInline): 
     model = UserPhone 

    class UserAdmin(admin.ModelAdmin): 
     list_display =() 

     inlines = [ 
       UserPhoneInline, 
      ] 
     def save_model(self, request, obj, form, change): 
      obj.save() 
      print "form:",form.changed_data,"change:",change 

    class UserPhoneAdmin(admin.ModelAdmin): 
     list_display =() 
     list_filter= [] 

答えて

0
モデル Userphoneは、モデル Userにインラインであれば

まず最初にまず、あなたはおそらくそれがに、不要なであるため、これらの行を削除する:次に、あなたは両方のフォームにアクセスしたい場合は

class UserPhoneAdmin(admin.ModelAdmin): 
    list_display =() 
    list_filter= [] 

データ私が見ることができるのアプローチは、(admin.pyにこれを追加する)、そのようBaseInlineFormSetcleanメソッドをオーバーライドすることです:

class InlineFormset(forms.models.BaseInlineFormSet): 
    def clean(self): 
     for form in self.forms: 
      for field in form.changed_data: 
       print (form.cleaned_data[field]) 

あなたが理解している通り、changed_dataはあなたが誤解していると思います。これはdocumentationからです:

changed_data属性の値フォームのバインドされたデータ(通常はrequest.POST)で初期に提供されたものから を異なるフィールド の名前のリストを返します。 のデータがない場合は、空のリストを返します。

したがって、私の解決策では、フォームを壊すときにどのデータが変更されたかを確認するために使用します。次に、私はcleaned_dataを使用します。これは、フォームによって検証されたすべての値の辞書であり、変更されたフィールドに対応する値にアクセスします。あなたが印刷したものを気楽にお気軽に。

EDIT

は、私はあなたのインライン宣言に次の行を追加する必要が言及するのを忘れてしまった:

class UserPhoneInline(admin.TabularInline): 
    model = UserPhone 
    formset = InlineFormset #line to add 
+0

私はただ、我々はまた、他のフィールドで保存しようとしているオブジェクトを知りたいです。クリーンメソッドで完全なオブジェクトを取得するオプションはありますか? InlineFormsetクラスでsave_model関数を使用できますか? – shiva

+0

追加する天気やデータを編集する方法は? – shiva

+0

あなたは複数の異なる質問をしているようです... _full object_とはどういう意味ですか?私のためにデータを追加してデータを編集するのは何かではないのですか? – scharette

関連する問題