Показать созданные / измененные поля 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). Но вы должны сначала написать контекстный процессор и / или шаблонный тег, чтобы получить значение записи... и так далее...