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


88

Як моє поле "дата" не з'являється в системі адміністратора?

У моєму файлі 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.

Хтось має якусь ідею?

Відповіді:


56

Я вірю, що міркування лежить на auto_now_addполі.

З цієї відповіді :

Будь-яке поле з набором атрибутів auto_now також успадкує editable = False і, отже, не відображатиметься на панелі адміністратора.

Також згадується в документах :

Як реалізовано в даний час, встановлення для параметра auto_now або auto_now_add значення True призведе до того, що для поля буде встановлено значення editable = False і blank = True.

Це має сенс, оскільки немає жодних причин для редагування поля, якщо воно буде замінено поточним часом і датою, коли об’єкт буде збережено.


31
Хоча, звичайно, ви повинні мати можливість редагувати auto_now_addчерез адміністратора після того, як запис був створений вперше?
Крістофер Орр,

68
Ви також повинні мати можливість просто відображати його в інтерфейсі адміністратора, навіть якщо його не можна було редагувати.
Бред

1
Будь ласка, зверніться до відповіді @hunger нижче, щоб дізнатись, як відобразити його як поле лише для читання в інтерфейсі адміністратора.
guival

1
Має сенс мати поле для редагування, якщо поле вводиться лише для створення об’єкта (auto_now_add = True).
sergzach

206

Якщо ви дійсно хочете побачити дату в адміністративній панелі, ви можете додати readonly_fieldsв admin.py :

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

admin.site.register(Rating,RatingAdmin)

Будь-яке вказане вами поле буде додано останнім після редагованих полів. Для керування порядком можна скористатися fieldsопціями.

Додаткову інформацію можна отримати в документації Django .


33
ЦЕ справжня відповідь !!
GreenAsJade

4
якщо ви обумовити fieldsви також повинні помістити ваше поле в цьому, так що вам буде потрібно , як в readonly_fieldsі в fieldsіншому випадку поле не буде доступний широкому.
Бьорн,

Я просто хотів зазначити, що це також застосовувалося, якщо ви використовуєте fieldsets, щойно натрапило на цю проблему сьогодні.
Кевін Браун,

1
Завдяки цьому поле з’явиться лише тоді, коли ми клацнемо та відкриємо певний запис. Якщо ви хочете, щоб поле було видно в самому ListView тоді stackoverflow.com/a/34966908/4440874
Jyotman Singh

1
Зауважте, що я не впевнений, чому, але, схоже, це не працює для DateTimeFields auto_now_add=Trueпід Django 1.9. (Різновидом) обхідного шляху є додавання їх до list_displayкортежу замість цього. Редагувати: це спрацює, якщо ви також додасте своє поле до fieldsзгаданого @BjornTipling.
Тейлор Едмістон,

23

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

Якщо вам дійсно потрібно це зробити (як і мені), ви завжди можете обірвати це, негайно встановивши поле "редагованим", визначивши поле наступним чином:

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

Це зробить поле доступним для редагування, тому ви зможете насправді його змінити. Здається, це чудово працює, принаймні з движком підтримки MySQL. Я не можу сказати для сертифіката, чи інші резервні сховища зроблять ці дані незмінними в базі даних і, отже, спричинять проблему при спробі редагування, тому використовуйте з обережністю .


Ні, не робіть цього, використовуйте рішення readonly_fields, описане Hunger.
GreenAsJade

2
@GreenAsJade: Обгрунтування було б непоганим.
mhsmith

@mhsmith Rationale використовувати замість цього рішення Hunger: оскільки це головний хак і поставляється з "обережністю", тоді як рішення Hunger використовує django так, як воно призначене для використання. Чому ви ризикуєте зробити серйозний хак, коли ви можете робити те, що вам потрібно, законно та за підтримки?
GreenAsJade

6
Це хакерське рішення не таке вже й погане. Єдиним варіантом використання, однак, на мою думку, є тестування - коли тестеру потрібно змінити дату.
jacoor

2
просто попередження: цей хак зіпсував міграції для мене
Даміо

16

Залежно від ваших конкретних потреб та будь-яких нюансів різниці у поведінці, ви можете зробити наступне:

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


1
Я б використовував from django.utils.timezone import nowзамість цього datetime.now, але це виглядає багатообіцяючим.
amjoconn

Дякую, я його змінив.
орблівіон

Stackoverflow чудовий, тому що деякі відповіді дають вам зрозуміти, що ви не задали правильне питання! Дякую.
Самуель Даузон,

5

Можливо, це пов’язано з тим, що auto_now_add відповідає дійсності. Можливо, замість цього параметра для фіксації дати при додаванні ви можете замінити метод збереження моделі, щоб вставити дату і час, коли ідентифікатор нульовий.

class Rating(models.Model):

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

Якщо ви це зробили, тоді немає причин визначати поле як auto_now
FallenAngel

Не впевнений, чому голос проти; перше посилання, яке надає Шон Чін, вказує на подібний підхід.
Джо Дж.

Це розумна альтернатива, якщо припустити, що auto_nowне використовується і editable=False. +1
Шон Чін,

3

Якщо ви хочете, щоб будь-яке поле було видимим у списку всіх ваших записів (коли ви клацаєте на моделі в адміністраторі), а не коли ви відкриваєте цей конкретний запис, тоді -

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

admin.site.register(Rating, RatingAdmin)

'ім'я' - це ваше основне поле або будь-яке інше поле, яке ви хочете відобразити на панелі адміністратора.

Таким чином ви можете вказати всі стовпці, які ви хочете бачити.


0

Ви не можете цього зробити, перевірте документацію

auto_now та auto_now_add - це всі поля, що не можна редагувати, і ви не можете їх замінити ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.