2016-04-06 10 views
3

まあ、DDBBの構造を気にせずにモデルのインスタンスを保存したいです。だから私はすべてのモデルのクラスでオーバーライドdef saveを決定する。種類:Django管理のオーバーライドセーブメソッド

def save(self, force_insert=False, force_update=False, using=None, update_fields=None): 
    if condition: 
     raise Exception("You can´t insert that element") 
    return super(name_class, self).save(self, force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields) 

さて、これで私は例外をrasingない挿入するために達成するため、しかし、インスタンスは、私は主要な制限が存在しているものは何でもDBに挿入するには、このチェックに合格した場合...

どのようにすることができますわかった?

コアコードsaveを無効にする必要があると思いますが、確認してDBに挿入する条件を確認する部分が見つかりませんでした。 多分、問題はフォームの検証だけです。

Django Adminで特定のフォームを上書きする方法。具体的には、モデルの1つのクラスを追加、削除、または編集する場所です。

+0

モデルの保存方法を上書きすることができます。ここに例があります:http://stackoverflow.com/questions/4269605/django-override-save-for-model –

+0

ラムありがとう、それは私がやっていることです。私のポストを最初にチェックしてください。問題は、保存を拡張するのではなく、オーバーライドすることです。 私のモデルにはプライマリキーの制限がありますが、実際のDBはありません(それは意味がないように見えますが...:P)。データが自分の小切手を渡す場合は、挿入を強制したい(is_valid = Trueかもしれません...) 私の2つのアプローチは以下の通りです:save(拡張しない)またはフォーム上で検証をジャンプ –

答えて

5

ModelAdminのsave_modelを上書きできます。

class MyAdminView(admin.ModelAdmin): 
     def save_model(self, request, obj, form, change): 
      super(MyAdminView, self).save_model(request, obj, form, change) 
+0

['save_model']の上にあるドキュメントの最初のものhttps://docs.djangoproject.com/en/1.9/ref/contrib/admin/#modeladmin-methods)は、「拒否目的ではない」という警告です。 – Sayse

+0

私は確認しませんでした。私は同じものになると思います。 。これで私はメソッドを拡張しています。私が親を呼び出すとき、それは同じことをするでしょう。 PKの制限を確認して挿入を拒否します。 –

+0

うん。やったよ。新しい要素を追加しようとすると、主キーの制限の警告が表示されます。私はsave_modelをオーバーライドし、obj内のリクエストのフィールドを回復し、objを保存します。 他の部分では、Priamryキーの制限がチェックされています。私はいつ保存するか(save()、save_model()、...)、または検証フェーズ(clean()、validate()、...)を知らない。すべての手がかりは? –

1

あなたは、保存方法では全く検証のいずれかの種類をやってはならない、モデルがvalidating objects

を参照してください、あなたがしたい任意の検証は詳細についてはその代わりに

で行う必要がありそうclean方法を持っています

+0

Thanks Sayse。私はモデルでクリーンアップをオーバーライドし、自分のチェックで例外を発生させるだけです。他に何もない。 しかし、テーブルに新しいレコードを追加しようとすると、プライマリキーの制限が私に警告します。私はこれで迷っています...:S Django Adminフォームの検証を強制するもの...(is_valid()= True)... –