将django admin链接到外键对象

Lau*_*ent 25 django foreign-key-relationship django-admin

我有一个带有ForeignKey的模型A到模型B.在Django admin中,如何在打开模型B的管理页面的ForeignKey字段旁边的模型A的管理页面中添加一个链接?

ger*_*ett 32

您可以执行以下操作:

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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

将yourapp替换为您的应用程序名称.

  • 如果有人也使用这个答案,你的模型必须在`reverse`函数中小写.那将是:`"admin:yourapp_yourmodel_change"`. (6认同)
  • 在Django 1.9+中不再需要 - 请参阅FK项目旁边的铅笔图标. (2认同)

Ben*_*b96 22

除了接受的答案之外,在较新版本的Django(1.10,1.11和2.0)中,反向方法现在位于包django.urls中(参见此链接).

此外,您必须使用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'
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答。我已经扩展了这个概念,但以一种可跨模型重用的方式:/sf/answers/3716505831/ (2认同)
  • 请注意,反向链接中使用的“auth”是模型所在的应用程序名称。一般来说,它应该是“admin:myapp_mymodel_change”的形式 (2认同)

Tob*_*nst 8

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',
    )
Run Code Online (Sandbox Code Playgroud)