2012-02-10 15 views
1

特定のタイプの最後のオブジェクト(テーブルの最後の行)を削除しないようにする方法はありますか?そのようなオブジェクトは一般的に削除できるはずですが、少なくとも1つのエントリが残っていることが必要です。この特定のケースでは、少なくとも1つのエントリがユーザに関連付けられています。Django管理者の場合、最後のオブジェクトの削除を防ぐ方法

私は、モデルの削除機能をオーバーライドしてみました:

def delete(self, *args, **kwargs): 
    others = Presentation.objects.filter(user=self.user).exclude(pk=self.pk) 
    if len(others) < 1: 
     pass 
    else: 
     super(Presentation, self).delete(*args, **kwargs) 

これは動作しますが、ユーザーが削除が実際に成功したことを告げています。私はむしろ、検証が失敗したときのように、表示されるエラーメッセージが好きです。検証は、私が知る限り、保存にのみ適用されます。

答えて

2

これも試してもらえますか?

# admin.py 
class MyModelAdmin(admin.ModelAdmin): 
    def delete_model(self, request, obj): 
     if last_record: 
       storage = messages.get_messages(request) 
       storage.used = True 
       messages.error(request, 'Cannot delete last record.') 
     else: 
       obj.delete() 

また、jQueryを使用して成功メッセージのdivまたはspanを非表示にすることもできます。

+0

これは動作しませんでした。 'clean()'は保存時には明らかに呼び出されますが、削除時には呼び出されません。 – pholz

+0

それは意味があります。削除時に何かをきれいにする理由はありません。私の悪い。 –

+0

私の回答を更新しました –

1

私はあなたに別のアプローチを示唆している:pre_deleteとあなたの条件に上げて、例外する

1)を作成し、信号を接続します

def on_delete(sender,**kwargs): 
    if <condition>: 
     raise Exception('Abort delete') 
    #else: continue and delete 

pre_delete.connect(on_delete,sender=Presentation) 

2)次に、ビュー上で、あなたがキャッチすることができますこの例外

# view code... 
try: 
    object.delete() 
except: 
    # add the desired info to context 

とにかく、あなたはまた、例外をスローし、ビューのコードでそれをキャッチするmodel::deleteを上書きすることができます。

+0

「ビューで」とはどういう意味ですか?カスタムビューは使用しませんが、組み込みのdjango管理ビューと組み込みのテンプレートは使用しません。カスタムビューを作成してカスタムテンプレートを使用する必要がありますか? – pholz

+0

* **これは管理者が内蔵のビューとテンプレートでのみ**を使用している場合は、管理者テンプレートに既にフォームエラーが表示されているので、dan-klassonの方が優れています....しかし、この管理フォームではなく、あなたの状態をチェックしません:S – jgsogo

関連する問題