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
.
Есть ли у кого-нибудь идеи?
Ответы
Ответ 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 - это все не редактируемые поля, и вы не можете их переопределить...