Показать созданные / измененные поля django_extensions в интерфейсе администратора

У меня есть класс на основе TimeStampedModel от django-extentions:

from model_utils.models import TimeStampedModel


class MyClass(TimeStampedModel):
    pass

По умолчанию в интерфейсе администратора created а также modified поля не отображаются на странице издания my_app/myclass/id,

Я попытался этот взлом, чтобы заставить отображение created а также modified поля на странице редактирования администратора для MyClass:

from django.contrib import admin

from my_app.models import MyClass


class MyClassAdmin(admin.ModelAdmin):
    fields = MyClass._meta.get_all_field_names()

admin.site.register(MyClass, MyClassAdmin)

Но это породило следующее исключение:

Exception Type:     FieldError
Exception Value:    Unknown field(s) (modified, created) specified for MyClass. Check fields/fieldsets/exclude attributes of class MyClassAdmin.

Любая идея, как я могу отобразить created а также modified поля в MyClass редакция интерфейса администратора?

Примечание 1: MyClass это модель с большим количеством полей, в том числе ManyToMany поля. Я могу отобразить все поля, кроме created а также modified поля из базового класса TimeStampedModel,

Примечание 2: Ссылка на страницу администратора является страницей издания строки: my_app/myclass/id

2 ответа

Решение

Решение состоит в том, чтобы использовать readonly_fields атрибут:

from django.contrib import admin

from my_app.models import MyClass


class MyClassAdmin(admin.ModelAdmin):
    readonly_fields = ('created', 'modified', )

admin.site.register(MyClass, MyClassAdmin)

Созданы и изменены являются самоуправляемыми полями. Я думаю, что "взломать" функционал не очень хорошая идея. Вы можете отобразить эти поля в виде списка следующим образом:

Для многих ко многим проблема:

def <funcname>(self, obj):
    return ', '.join([object.<object_field_you_want_to_display> for object in obj.<manyTomanyField>.all()])

<funcname>.short_description = 'Wanted name for column'

Затем в list_display:

list_display = (...., '<funcname>')

И тогда вы хотите отобразить все поля, которые вы хотите (созданы и изменены тоже)

list_display(...all fields you want ..., '<funcname>', 'created', 'modified')

Но если вы все еще думаете, что это хорошая идея, вы должны добавить эти поля в свой шаблон (/include/fieldset.html). Но вы должны сначала написать контекстный процессор и / или шаблонный тег, чтобы получить значение записи... и так далее...

Другие вопросы по тегам