2012-02-29 15 views
5

ORMレベルで既存のモデルインスタンスの編集を無効にする方法がありますか?Django - モデル編集を無効にする

私はテンプレートから「保存」と「保存して続行」ボタンを削除することについて話しているわけではありません。モデルのコミットされたインスタンスの値を変更できる操作はありません。

好ましくは、[名前を付けて保存]オプションが代わりに機能するはずです。

答えて

8

そうのようなあなたのモデルのための機能を上書き保存:例えば、何のPKがない場合

 
class MyModel(models.Model): 

    def save(self, *args, **kwargs): 

     if self.pk is None: 
      super(MyModel, self).save(*args, **kwargs) 

この機能は、(実際には変更が保存されます)機能を救うスーパークラスを呼び出しますモデルインスタンスは新しいインスタンスです。

+3

私はこのアプローチについて気に入らないのは、保存をクリックした後に "The ... was changed was successfully。"というメッセージが残っていて、何も変更されていないということです。このメッセージを「変更が無効です」に変更する方法はありますか?それとも、その行をクリックしないようにするのが良いでしょうか? – WebOrCode

+3

'MyModel.objects.filter(pk = my_model.pk).update(name =" bob ")' –

4

あなたは、あなたのモデルクラスのsave()をオーバーライドすることができます(self.pkあれば何もしない)とdelete(常に何もしない)

をしかし、実際には、データベースレベルではそのための最も安全な場所です。管理者はこのことについて何も知らないだろう、

CREATE RULE noupd_myapp_mymodel AS ON UPDATE TO myapp_mymodel 
    DO NOTHING; 
CREATE RULE nodel_myapp_mymodel AS ON DELETE TO myapp_mymodel 
    DO NOTHING; 

いずれにせよ、そのすべてが、まだ編集可能になります。たとえば、PostgreSQLでは次の2つの簡単なルールを書くことができます。管理者のモデルを読み取り専用にする試みについては、Whole model as read-onlyへの私の答えを参照してください。目的のためには、そのまま追加権限を保持し、追加しないときはすべてのフィールドを読み取り専用として宣言します。

EDIT:モデルクラスでdelete()を無効にするのが安全でない理由の1つは、「一括削除」(Queryset.delete()、たとえばadmin checkboxes action)が個々のインスタンスのdelete )メソッドでは、SQLに直接進む:https://docs.djangoproject.com/en/dev/topics/db/queries/#deleting-objects

+0

を防ぐ方法はありますか?この回答をありがとうございます。私はこれらのルールをmodels.pyに渡す方法を理解しようとしています。私が見つけたドキュメントのうち最も関連性の高い部分は、[カスタムSQLを直接実行する](https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly)でした。このアプローチを説明するための簡単な例を教えてください。 – raratiru

+1

上記のSQLステートメントは、好きなように一度だけ実行されます。ルールがPostgresに入ったら、それは守られます。 psqlを使ってこれを行うことができます。モデルの移行にSouthを使用する場合は、db.execute()のカスタム移行をお勧めします。例えば、回答を参照してくださいhttp://stackoverflow.com/a/5466251/640759 –

関連する問題