Dlaczego moje pole „data” nie pojawia się w systemie administracyjnym?
W moim pliku admin.py mam
from django.contrib import admin
from glasses.players.models import *
admin.site.register(Rating)
a model oceny zawiera pole o nazwie „data”, które wygląda następująco
date = models.DateTimeField(editable=True, auto_now_add=True)
Jednak w systemie administracyjnym pole nie jest wyświetlane, mimo że editable
jest ustawione na True
.
Czy ktokolwiek ma jakiś pomysł?
źródło
auto_now_add
przez administratora po utworzeniu wpisu?Jeśli naprawdę chcesz zobaczyć datę w panelu administratora, można dodać
readonly_fields
w admin.py :class RatingAdmin(admin.ModelAdmin): readonly_fields = ('date',) admin.site.register(Rating,RatingAdmin)
Każde określone pole zostanie dodane jako ostatnie po polach edytowalnych. Aby kontrolować kolejność, możesz skorzystać z
fields
opcji.Dodatkowe informacje są dostępne w dokumentacji Django .
źródło
fields
musisz również umieścić w tym swoje pole, więc potrzebujesz go zarówno w, jakreadonly_fields
iwfields
przeciwnym razie pole nie pojawi się.fieldsets
, właśnie dzisiaj napotkałem ten problem.auto_now_add=True
Django 1.9. (W pewnym sensie) obejściem jest dodanie ich dolist_display
krotki. Edycja: zadziała, jeśli dodasz również swoje polefields
jako wspomniane @BjornTipling.Duży hack:
Jeśli naprawdę musisz to zrobić (tak jak ja), zawsze możesz się obejść, natychmiast ustawiając pole jako „edytowalne”, definiując pole w następujący sposób:
class Point(models.Model): mystamp=models.DateTimeField("When Created",auto_now_add=True) mystamp.editable=True
To sprawi, że pole będzie można edytować, więc będziesz mógł je zmienić. Wydaje się, że działa dobrze, przynajmniej z silnikiem kopii zapasowej mysql. Nie mogę powiedzieć dla certian, czy inne magazyny zapasowe uczyniłyby te dane niezmiennymi w bazie danych, a tym samym spowodowałyby problem podczas próby edycji, więc używaj ostrożnie .
źródło
W zależności od Twoich konkretnych potrzeb i wszelkich niuansów w zachowaniu możesz wykonać następujące czynności:
from django.utils.timezone import now class MyModel(models.Model): date = models.DateTimeField(default=now)
Domyślne pole można wykorzystać w ten sposób: 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.
To nie pozwala na edycję
False
źródło
from django.utils.timezone import now
zamiastdatetime.now
, ale wygląda to obiecująco.Może mieć to związek z faktem, że auto_now_add jest prawdziwe. Być może zamiast tego parametru do przechwytywania daty dodania można zastąpić metodę zapisu modelu, aby wstawić datę i godzinę, gdy identyfikator ma wartość null.
class Rating(models.Model): .... def save(self, *args, **kwargs) if not self.id: self.date = datetime.datetime.now()
źródło
auto_now
nie jest używana ieditable=False
. +1Jeśli chcesz, aby jakiekolwiek pole było widoczne na liście wszystkich twoich wpisów (po kliknięciu modelu w osobach administratora), a nie po otwarciu tego konkretnego wpisu, to -
class RatingAdmin(admin.ModelAdmin): list_display = ('name', 'date') admin.site.register(Rating, RatingAdmin)
„nazwa” to Twoje główne pole lub inne pole, które chcesz wyświetlić w panelu administracyjnym.
W ten sposób możesz określić wszystkie kolumny, które chcesz zobaczyć.
źródło
Nie możesz tego zrobić, sprawdź dokumentację
auto_now i auto_now_add to pola nieedytowalne i nie można ich zastąpić ...
źródło