2016-05-14 9 views
1

二つのモデルForeignKeyレコードをDjango Adminの詳細ビューにリンクしますか?

models.py

class ModelA(models.Model): 
    pass 

class ModelB(models.Model): 
    a = models.ForeignKey(ModelA, null=True) 

admin.pyが

class ModelBAdmin(admin.ModelAdmin): 
    list_display = ('id', 'a',) 
    list_display_links = None 
    ordering = ('-id',) 

admin.site.register(ModelB, ModelBAdmin) 


class ModelAAdmin(admin.ModelAdmin): 
    list_display = ('id',) 
    list_display_links = None 

admin.site.register(ModelA, ModelAAdmin) 

がある場合のリストビューにその詳細ビューでaをリンクする方法はありますModelB?そうでない場合は、ModelBの詳細ビューで同じことを実行できますか?つまり、詳細ビューへのリンクとしてaと表示されますか?

現在、ModelBのリストビューでは、idModelAです。そしてその詳細を見るためには、私はModelAリストビューに行きidを検索しなければなりません。私はModelBのリストビューのidが(} /admin/ModelA/{a.idのような)aの詳細ビューを指すようにしたい

答えて

2

あなたがこれを行うことができますので、リストビューのフィールドは、呼び出し可能になります

from django.core.urlresolvers import reverse 

class ModelBAdmin(admin.ModelAdmin): 
    list_display = ('id', 'a_link',) 
    list_display_links = None 
    ordering = ('-id',) 

    def a_link(obj): 
     return format_html('<a href="{}">{}</a>', reverse(
      'admin:myapp_a_change', args=[obj.a.id]), obj.a.name) 
    a_link.short_description = "Model A Details" 

admin.site.register(ModelB, ModelBAdmin) 
+0

「admin:myapp_a_change」には「a」とは何ですか?私はモデルクラス 'class MyModelClass(models.Model)'に対して 'admin_MyModelClass_change'と' admin_my_model_class_change'の両方を試しましたが、逆マッチが見つからないと言うたびに 'admin_MyModelClass_change'と' admin_my_model_class_change'の両方を試しました。 –

+0

「フィールドは呼び出し可能です」とありがとう。私はどこかでそれを読んで覚えている、ちょうど完全にそれを忘れた。 –

+0

"a"はあなたのモデルの名前でなければなりません。 ModelAから管理者に行くと、URLはmysite/admin/myapp/the_class_name_you_need_to _useでなければなりません。 – evergreen