Сделайте ссылку на объект внешнего ключа на экране администратора

У меня есть такой класс, в котором есть ForeignKey

class MyLog(SafeDeleteModel):
    user = models.ForeignKey(CustomUser,on_delete=models.CASCADE)

То есть я указан пользователем MyLog на странице администратора.

class MyLogAdmin(admin.ModelAdmin):
    list_display = ["id","user"]
class UserAdmin(admin.ModelAdmin):
    list_display = ["id","username"]

Теперь я хочу сделать ссылку на пользователя страницы MyLogAdmin на UserAdmin,

Возможно ли это?

Я думаю, что в некоторых фреймворках (например, php symfony) система администратора делает это автоматически.

Как это можно сделать с помощью администратора django?

Это, как ни странно, не встроенная функция. Но мы можем эффективно сделать это сами с помощью:

from django.utils.html import format_html


class MyLogAdmin(admin.ModelAdmin):
    list_display = ['id', 'username_link']

    @admin.display(ordering='user__username', description='User')
    def username_link(self, obj):
        return format_html(
            '<a href="{}"></a>',
            reverse(
                'admin:appname_customuser_change',
                kwargs={'object_id': obj.user_id},
            ),
            obj.user,
        )

с appname именем приложения, в котором вы определили CustomUser модель (которая не сама по себе такая же, как MyLog модель).


Note: It is normally better to make use of the settings.AUTH_USER_MODEL [Django-doc] to refer to the user model, than to use the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.


Note: We can boost efficiency by fetching the details of related models in the same query in a ModelAdmin with the .list_select_related attribute [Django-doc]. In this specific case this thus looks like:

class MyLogAdmin(admin.ModelAdmin):
    list_select_related = ['user']
    # …
Вернуться на верх