web-dev-qa-db-ja.com

Django adminの外部キーオブジェクトへのリンク

私はモデルBへの外部キーを持つモデルAを持っています。Django adminでは、モデルAの管理ページで、外部ページの管理ページを開くForeignKeyフィールドの横にリンクを追加するにはどうすればよいですか?モデルB?

25
Laurent

次のことができます。

models.py(例):

model B(models.Model):
    name = models.CharField(max_length=20)

model A(models.Model):
    field1 = models.CharField(max_length=20)
    Bkey = models.ForeignKey(B)

admin.py

from Django.core import urlresolvers

class AAdmin(admin.ModelAdmin):
    list_display = ["field1","link_to_B"]
    def link_to_B(self, obj):
        link=urlresolvers.reverse("admin:yourapp_b_change", args=[obj.B.id]) #model name has to be lowercase
        return u'<a href="%s">%s</a>' % (link,obj.B.name)
    link_to_B.allow_tags=True

Yourappをアプリの名前に置き換えます。

35
ger.s.brett

受け入れられた回答に加えて、Django(1.10、1.11 and 2.0)の新しいバージョンでは、reverseメソッドパッケージに含まれていますDjango.urls(cf. this link )。

さらに、format_htmlメソッドを使用して、管理でHTMLを出力する必要があります。したがって、allow_tagsは役に立たなくなります。

最後に、ユーザーの編集ページへのリンクを追加するために、admin.pyに次の関数があります。

from Django.urls import reverse
from Django.utils.html import format_html


class ObjectAdmin(admin.ModelAdmin):
    list_display = ('name', 'link_to_user')

    def link_to_user(self, obj):
        link = reverse("admin:auth_user_change", args=[obj.user.id])
        return format_html('<a href="{}">Edit {}</a>', link, obj.user.username)
    link_to_user.short_description = 'Edit user'
26
Benbb96

Django 2.0以降およびPython 3.5以降:

from Django.urls import reverse
from Django.utils.html import escape, mark_safe

@admin.register(models.YourModel)
class YourModelAdmin(BaseModelAdmin):
    def model_str(self, obj: models.YourModel):
        link = reverse("admin:module_model_change", args=[obj.model_id])
        return mark_safe(f'<a href="{link}">{escape(obj.model.__str__())}</a>')

    model_str.short_description = 'Model'
    model_str.admin_order_field = 'model' # Make row sortable

    list_display = (
        'model_str',
    )
14
Tobias Ernst

私はミックスインを作成しましたが、これは多対多のリレーションと同様のことを行います(関連するオブジェクトの数と適切なフィルターを使用したチェンジリストへのリンクが表示されます)。私が分岐した要点に基づいて:

https://Gist.github.com/hovi/2e3a216ecc4be685ec9e0d23b0eb7901

Django 1.1.xおよび1.0.xでテスト済み

0
K.H.

relatedがリンクされる外部キーフィールドである今日、より簡単な解決策があります:

class YourModelAdmin(model.modelAdmin):
    list_display = ["field_one", "field_two", "related"]
    list_display_links = ["field_one", "related"]
0
keeshux