DateTimeField не отображается в системе администратора - PullRequest
73 голосов
/ 17 июня 2011

Почему мое поле "дата" не появляется в системе администратора?

В моем файле admin.py у меня есть

from django.contrib import admin
from glasses.players.models import *
admin.site.register(Rating)

и модель рейтинга имеет поле под названием «дата», которое выглядит следующим образом

date = models.DateTimeField(editable=True, auto_now_add=True)

Однако в системе администратора это поле не отображается, даже если для editable установлено значение True.

У кого-нибудь есть идеи?

Ответы [ 7 ]

173 голосов
/ 14 мая 2014

Если вы действительно хотите видеть дату на панели администратора, вы можете добавить readonly_fields в admin.py :

class RatingAdmin(admin.ModelAdmin):
    readonly_fields = ('date',)

admin.site.register(Rating,RatingAdmin)

Любое указанное вами поле будет добавлено последним послередактируемые поля.Для управления заказом вы можете использовать опции fields.

Дополнительная информация доступна в Django docs .

45 голосов
/ 17 июня 2011

Я полагаю, что причина лежит в поле auto_now_add.

С этот ответ :

Любое поле с атрибутом auto_now set также наследует editable = False и, следовательно, не будет отображаться в Панель администратора.

Также упоминается в документах :

Как в настоящее время реализовано, настройка auto_now или auto_now_add в True будет сделать поле доступным для редактирования = False и пусто = верно установлено.

Это имеет смысл, поскольку нет смысла редактировать поле, если оно будет перезаписано текущим временем и датой при сохранении объекта.

21 голосов
/ 30 мая 2013

Major Hack:

Если вам действительно нужно это сделать (как я), вы всегда можете взломать его, сразу установив поле как «редактируемое», определив поле какследует:

class Point(models.Model):
  mystamp=models.DateTimeField("When Created",auto_now_add=True)
  mystamp.editable=True

Это сделает поле редактируемым, так что вы действительно сможете его изменить.Кажется, что он работает нормально, по крайней мере, с поддержкой MySQL.Я не могу сказать наверняка, если другие резервные хранилища сделают эти данные неизменяемыми в базе данных и, следовательно, вызовут проблему при попытке редактирования, , поэтому используйте с осторожностью .

7 голосов
/ 28 декабря 2014

В зависимости от ваших конкретных потребностей и любых нюансов различий в поведении, вы можете сделать следующее:

from django.utils.timezone import now

class MyModel(models.Model):
    date = models.DateTimeField(default=now)

Поле по умолчанию можно использовать следующим образом: https://docs.djangoproject.com/en/dev/ref/models/fields/#default

The default value for the field. This can be a value or a callable object. If callable it will be called every time a new object is created.

Это не позволяет редактировать False

5 голосов
/ 17 июня 2011

Это может быть связано с тем, что auto_now_add имеет значение true. Возможно, вместо этого параметра для захвата даты при добавлении вы можете переопределить метод сохранения модели, чтобы вставить дату и время, когда идентификатор равен нулю.

class Rating(models.Model):

    ....
    def save(self, *args, **kwargs)
        if not self.id: 
            self.date = datetime.datetime.now()
3 голосов
/ 23 января 2016

Если вы хотите, чтобы какое-либо поле было видно в списке всех ваших записей (когда вы нажимаете на модель в администраторах), а не когда вы открываете эту конкретную запись, -

class RatingAdmin(admin.ModelAdmin):
    list_display = ('name', 'date') 

admin.site.register(Rating, RatingAdmin)

'name' - ваше основное поле или любое другое поле, которое вы хотите отобразить на панели администратора.

Таким образом, вы можете указать все столбцы, которые хотите видеть.

0 голосов
/ 17 июня 2011

Вы не можете сделать это, проверьте документацию

auto_now и auto_now_add все недоступны для редактирования поля и вы не можете их переопределить ...

...