Как правильно добавить пользовательское поле в качестве вызываемого в форму изменения администратора Django?

Я пытаюсь добавить пользовательское поле (pretty_user) на страницу администрирования модели, которое отображает информацию о пользователе в красивом виде. Я добавляю модель как вызываемое поле непосредственно в класс ModelAdmin. Это прекрасно работает в представлении list_display, но полностью разрушается в представлении change_form.

@admin.register(Model1Admin)
class Model1Admin(admin.ModelAdmin):
    readonly_fields = [
        'id', 'configuration', 'ip_address', 'downloads', 'user', 'downloaded']

    list_display = ['id','downloads','pretty_user','downloaded',]

    def pretty_user(self, obj):
        return f"{obj.user.get_full_name()} - ({obj.user.email})"
    pretty_user.short_description = 'User'

    def get_fields(self, request, obj=None):
        fields = ('id', 'downloads', 'pretty_user', 'downloaded')
        return fields

Дело в том, что у меня такая же структура добавления пользовательских полей в качестве callables в ModelAdmin для других моделей, и все они работают безупречно. Вот пример одной из них, где я добавляю render_logo в качестве пользовательского поля:

@admin.register(Model2Admin)
class Model2Admin(admin.ModelAdmin):
    list_display = ('id', 'name', 'name_long', 'created', 'updated', 'render_logo')
    readonly_fields = ['id', 'created', 'updated', 'render_logo']

    def get_fields(self, obj):
        fields = ('render_logo', 'id', 'name', 'name_long', 'created', 'updated')
        return fields
    
    def render_logo(self, m: 'Model2'):
        if m.logo is not None:
            return format_html(f'<img src="data:image/png;base64,{m.logo}" />')
        else:
            return format_html('<span>No logo</span>')

Я перепробовал все, чтобы заставить его работать, но не могу увидеть проблему. Есть идеи?

render_logo custom_fields работает, потому что вы сделали это поле readonly_fields.

Если вы сделаете поле pretty_user как readonly_field, то это также работает.

readonly_fields = ['id', 'configuration', 'ip_address', 'downloads', 'user','downloaded', 'pretty_user']

иначе вы создаете modelform, куда можно добавить любые пользовательские поля.

Вернуться на верх