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.