Администратор 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.

То, что я пробовал

  1. Проверил, существует ли поле в базе данных с помощью SQL-запросов (подтверждено ✅).
  2. Очистил кэш Django и перезапустил сервер:
    python manage.py collectstatic
    python manage.py runserver
    
  3. Проверено, правильно ли указано название поля в list_display (подтверждено ✅).
  4. Проверено, что list_display работает для других полей (другие поля отображаются корректно, отсутствует только creation_date ❌).

Ожидаемый результат

  • Я ожидаю увидеть creation_date, отображаемый в панели администратора Django в разделе VendorProduct.
  • Поле должно быть доступно только для чтения и не должно быть доступно для редактирования вручную.

Вопрос

Почему creation_date не отображается в панели администратора Django, хотя:

  • Он существует в базе данных.
  • Он правильно добавлен в list_display.
  • Миграции были успешно применены.

Что я здесь упускаю?

VendorProduct List view

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',) 
Вернуться на верх