2012-02-13 29 views
2
class SomeModel(models.Model): 
    end = models.DateTimeField() 

    def delete(self, *args, **kwargs): 
     now = datetime.datetime.now() 
     if self.end < now: 
      return # past events cannot be deleted 

     super(SomeModel, self).delete(self, *args, **kwargs) 

私のモデルの1つに上記のコードを記述しました。 それは美しく働いたが1つの問題持っています:。私は入れDjango:削除が防止されても、メッセージは正常に削除されます

を条件に方法私がある場合は、そのモデルがあるため、削除されていない場合でも、オブジェクトが正常に削除され、というメッセージを取得しています

をこの場合、オブジェクトは削除されないというメッセージを送信できますか?

NB:このモデルはdjango-admin専用です。

+1

メッセージを表示するコードが 'delete'の戻り値をチェックしないため、これが可能かどうかはわかりません。 –

答えて

2

Djangoの管理で削除ビューはdelete()呼び出しが成功したかどうかをチェックしませんので、あなたは、あなたの質問のようにdeleteメソッドをオーバーライドしたい場合、あなたは全体ModelAdmin.delete_viewメソッドをオーバーライドする必要があります。

SomeModelがDjango管理者でのみ使用されている場合は、has_delete_permissionメソッドをオーバーライドすることもできます。これにより、変更ビューから削除リンクが削除され、過去のイベントの削除ページが無効になります。 objがNoneのときに我々はFalseを返すよう

class SomeModelAdmin(admin.ModelAdmin): 
    ... 
    def has_delete_permission(self, request, obj=None): 
     """ 
     Return False for events in the past 
     """ 
     if obj is None: 
      # obj is None in the model admin changelist view 
      return False 
     now = datetime.datetime.now() 
     if obj.end < now: 
      return False # past events cannot be deleted 
     else: 
      return super(SomeModelAdmin, self).has_delete_permission(request, obj) 

上記の実装は、「削除選択したオブジェクト」admin actionを無効にします。とにかく、queryset deleteメソッドを呼び出すので、オーバーライドされたdeleteメソッドを呼び出さないので、これを実行することを検討する必要があります。

この方法では、スーパー管理者は引き続きすべての権限を持つイベントを削除することができます。 Django 1.4でhas_delete_permissionInlineModelAdminのオプションであることがわかりましたが、SomeModelがモデルのインラインで表示されていれば、このアプローチはうまくいかないでしょう。

+0

ありがとうございます。これはセーブです。 私はadminでのみ使用するので、has_delete_permissionを上書きしました。 「選択されたオブジェクトの削除」アクションを無効にするために、すでにget_action()をオーバーライドしています。だから、これは私にとっては問題ではありません。 – kra3

0

オーバーライドされたdelete()からTrueまたはFalseを返し、フォーム内の値で作業してメッセージを作成できます。

def delete(self, *args, **kwargs): 
    now = datetime.datetime.now() 
    if self.end < now: 
     return False # past events cannot be deleted 

    super(SomeModel, self).delete(self, *args, **kwargs) 
    return True #successfully deleted from the database 
+0

これも機能しません。私はこれを前に試しました。 私はDjango 1.3.1を使用しています。 – kra3

関連する問題