У меня есть модель A с ForeignKey для модели B. В Django admin, как я могу добавить ссылку на странице администратора модели A рядом с полем ForeignKey, которые открывают страницу администрирования модели B?
Ссылка в django admin на внешний ключевой объект
Ответ 1
Вы можете сделать следующее:
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 именем вашего приложения.
Ответ 2
В дополнение к принятому ответу, в более новых версиях Django (1.10, 1.11 и 2.0), метод reverse теперь находится в пакете django.urls (см. this ссылка).
Кроме того, вы должны использовать метод 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'
Ответ 3
Джанго 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',
)
Ответ 4
Сегодня существует более простое решение, related
тем, что поле внешнего ключа связано с:
class YourModelAdmin(model.modelAdmin):
list_display = ["field_one", "field_two", "related"]
list_display_links = ["field_one", "related"]