Администратор Django Не отображает поле "creation_date", несмотря на то, что оно находится в "list_display`
У меня есть проект на Django, в котором я работаю над приложением для электронной коммерции. Я использую SQLite в качестве своей базы данных и пытаюсь добавить поле creation_date
в свою модель VendorProduct, чтобы оно записывало, когда продукт был создан.
Что я сделал
Я добавил поле creation_date
в свою модель VendorProduct
следующим образом:
models.py
( Модель продукта поставщика)
from django.db import models
from django.utils.timezone import now
from userauths.models import CustomUser
class VendorProduct(models.Model):
user = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True, blank=True)
creation_date = models.DateTimeField(auto_now_add=True, blank=True, null=True)
def __str__(self):
return self.title
Миграции
Я запустил следующие команды, чтобы применить перенос:
python manage.py makemigrations vendorpannel
python manage.py migrate vendorpannel
Затем я проверил, что столбец creation_date
существует в моей базе данных, используя:
from django.db import connection
with connection.cursor() as cursor:
cursor.execute("PRAGMA table_info(vendorpannel_vendorproduct);")
columns = cursor.fetchall()
for column in columns:
print(column)
Результат подтверждает, что creation_date
существует в моей базе данных:
(7, 'creation_date', 'datetime', 0, None, 0)
Настройка панели администратора
Я обновил свою панель администратора, чтобы отобразить creation_date
:
admin.py
from django.contrib import admin
from .models import VendorProduct
class VendorProductAdmin(admin.ModelAdmin):
list_display = ('creation_date')
readonly_fields = ('creation_date',)
admin.site.register(VendorProduct, VendorProductAdmin)
Проблема: creation_date
Не отображается в Django Admin
Даже после внесения этих изменений и применения миграций поле creation_date
не отображается в панели администратора Django в разделе list_display
.
То, что я пробовал
- Проверил, существует ли поле в базе данных с помощью SQL-запросов (подтверждено ✅).
- Очистил кэш Django и перезапустил сервер:
python manage.py collectstatic python manage.py runserver
- Проверено, правильно ли указано название поля в
list_display
(подтверждено ✅). - Проверено, что
list_display
работает для других полей (другие поля отображаются корректно, отсутствует толькоcreation_date
❌).
Ожидаемый результат
- Я ожидаю увидеть
creation_date
, отображаемый в панели администратора Django в разделеVendorProduct
. - Поле должно быть доступно только для чтения и не должно быть доступно для редактирования вручную.
Вопрос
Почему creation_date
не отображается в панели администратора Django, хотя:
- Он существует в базе данных.
- Он правильно добавлен в
list_display
. - Миграции были успешно применены.
Что я здесь упускаю?
list_display
поле предназначено только для просмотра списком. В вашем случае это страница администратора, на которой перечислены экземпляры VendorProduct
.
На вашем скриншоте есть окно добавления, в котором отображаются только редактируемые поля.
Поскольку в вашем поле creation_date
есть опция auto_now_add
, это делает его недоступным для редактирования.
Если вы хотите вручную указать creation_date
, но при этом сохранить новое поведение по умолчанию, то вместо auto_now_add
используйте опцию default
.
creation_date = models.DateTimeField(default=datetime.now, blank=True)
Затем это поле появится в форме добавления. Возможно, попробуйте удалить его из поля только для чтения, если этого недостаточно
Во всех остальных случаях это поле должно отображаться для существующих экземпляров
list_display
это должен быть кортеж, а не строка.
т.е. list_display = ('creation_date', )
это не list_display = ('creation_date')
, поскольку python позже рассматривает поле как строку, и когда django ничего не находит, оно не показывает поле в пользовательском интерфейсе.
поэтому измените list_display, чтобы сделать его кортежем.
class VendorProductAdmin(admin.ModelAdmin):
list_display = ('creation_date', )
readonly_fields = ('creation_date',)