2012-01-22 1 views
0

私はAdminModelを持っています。しかし、私はそれらがすべてのフィールドが空のときに保存することはできません。私は、次を使用して、これを実装しました:M2Mリレーションシップをdjangoに保存するのをやめる

def save_model(self, request, obj, form, change): 
    if form.has_changed(): 
     obj.save() 
    else: 
     pass 

はしかし、モデルは別のモデルとのM2M関係を持っているので、私は保存打つとき、私は次のエラーを取得する:

instance needs to have a primary key value before a many-to-many relationship can be used. 

私は何が必要ですM2M関係を作成しようとするのを止めるためにこのメソッドに追加するには?

編集:

私はハックの回避策を追加しましたが、私はそれを行うためのより良い方法があるかどう知ることに興味があると思います。この問題を回避するには、elseを変更して、ModelAdminのフィールド属性を変更して、M2M関係のフィールドを含まないようにしました。これにより、関係を作成しようとしません。これはハッキーだけでなく、一度モデルを保存してエラーをスローした後にのみ機能します...

+0

解決できない場合は、解決してください。また、その解決策はスレッドセーフではありません。 –

+0

私が知りたいことをする方法があれば、私はちょうど解決しようとしていました。私はちょうど私が物事を試していたので、私はジャンゴに新しいです。 – Pikaling

+0

ああ、ローガーそれ! –

答えて

3

あなたはできません - save_m2msave_model後に呼び出されます。ドキュメントは、具体的 にオブジェクトを削除/保存する必要があり、彼らはむしろ彼らは にあなたをできるように、拒否権の目的ではありません、このフックはnot for veto purposes.

ModelAdmin.save_model()とModelAdmin.delete_model()であると言う余分な操作を実行します。

save_modelがトリガーしないようにフォームの検証が必要です。どういうわけか、すべてのフィールドが空白のままであることを検出する必要があります。

class MyForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 

    def clean(self): 
     if not any(self.cleaned_data.values()): 
      raise forms.ValidationError("All fields cannot be blank!") 
     return self.cleaned_data 

class MyAdmin(admin.ModelAdmin): 
    form = MyForm 
+0

私は 'any()'について知らなかった。非常に便利。 –

+0

@pastylegs 'any'と' all'! PS:WPであなたを見た! –

2

管理者レベルではなくフォームレベルで検証するのが最善でしょう。これを行うには、ModelAdminで使用するカスタムFormクラスを作成します。

from myapp.models import MyModel 
from django import forms 

class MyModelForm(forms.ModelForm): 
    pass 

    class Meta: 
     model = MyModel 

    def clean(self): 
     empty = True 
     for field_name, field_data in self.cleaned_data.iteritems(): 
      if field_data: 
       empty = False 
     if empty: 
      raise forms.ValidationError("The form cannot be empty") 
     return self.cleaned_data 

とあなたの管理者は、このフォームを使用することができます:だからforms.pyを作成します。 admin.pyで:

from myapp.forms import MyModelForm 
from django.contrib import admin 

class MyModelAdmin(admin.ModelAdmin): 
    ... 
    form = MyModelForm 
+0

'self.cleaned_dataのfield_data'を' field_name'、 'self.cleaned_data.iteritems()'のfield_dataに変更しなければなりませんでしたが、これは私が欲しかったことであり、非常に明確に説明されました。ありがとう! – Pikaling

+0

オハイオ州クール、混乱を避けるために更新します –

+1

とbtw、空のためのフィールドをチェックするためのユージの解決策はおそらくより簡潔です –

関連する問題