Подтвердить что ты не робот

DateTimeField не отображается в системе администратора

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

В моем файле 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.

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

4b9b3361

Ответ 1

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

Из этого ответа:

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

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

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

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

Ответ 2

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

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

admin.site.register(Rating,RatingAdmin)

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

Дополнительную информацию можно получить в документах Django.

Ответ 3

Основной хак:

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

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

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

Ответ 4

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

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

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

class Rating(models.Model):

    ....
    def save(self, *args, **kwargs)
        if not self.id: 
            self.date = datetime.datetime.now()

Ответ 6

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

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

admin.site.register(Rating, RatingAdmin)

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

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

Ответ 7

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

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