2016-04-14 6 views
1

Django 1.7では、管理モデルのresponse_deleteメソッドをオーバーライドして削除後にカスタムURLに強制的にリダイレクトすることができます。Django adminはオブジェクトの削除後に親にリダイレクトする

class MyAdmin(admin.ModelAdmin): 

    def response_delete(self, request, obj_display, obj_id): 
     return HttpResponseRedirect("my_url") 

私はさらに一歩これを取ると、それはかなり一般的なユースケースでなければなりませんように思える削除されたオブジェクトの、にリダイレクトする必要があります。

ただし、オブジェクトの削除により、親IDを取得するためのobjはありません。私が見つけた

ハックソリューションは、それを見つけるために、文字列を解析し、その後、子オブジェクト(obj_display)のUnicode表現に親IDを渡すことでした:

obj_display = '1 (Product 123)' 

integers = re.findall(r'\d+', obj_display) 
product_id = int(integers[1]) 

product_id = 123 

はしかし、これは洗練解決策のように思えます。たとえば、オブジェクトのUnicodeメソッドが変更された場合、リダイレクトが中断する可能性があります。より良い方法がありますか? 「親」と「子」によって

編集

私は削除(「子」)を意味し、オブジェクトが別のオブジェクト(その「親」)

+0

あなたが「削除されたオブジェクトの親」とは何を意味するのですか? – trinchet

+0

私は、削除されたオブジェクトが別のオブジェクトへの外部キーを持っていることを意味します。それはその親です。 –

答えて

0

への外部キーを持っていたあなたはこれを上書きすることができますメソッドdelete_view(削除する前にオブジェクトの親を取得することができます)を、return self.response_delete(request, obj_display, obj_id)の代わりに親管理ページにリダイレクトします。

0

あなたがdelete_viewの残りの部分を使用する能力を保持したい場合は、私はこのような両方delete_viewresponse_deleteを上書きをお勧めします:

class MyModelAdmin(admin.ModelAdmin): 
    deleted_fk = None 

    def delete_view(self, request, object_id, extra_context=None): 
     self.deleted_fk = MyModel.objects.get(id=object_id).fk 
     return super(MyModelAdmin, self).delete_view(request, object_id, extra_context) 

    def response_delete(self, request, obj_display, obj_id): 
     return redirect('url to deleted_fk') 
関連する問題