DateTimeField wird im Administrationssystem nicht angezeigt

84

Wie kommt es, dass mein Feld "Datum" im Administrationssystem nicht angezeigt wird?

In meiner admin.py Datei habe ich

from django.contrib import admin
from glasses.players.models import *
admin.site.register(Rating)

und das Bewertungsmodell hat ein Feld namens "Datum", das so aussieht

date = models.DateTimeField(editable=True, auto_now_add=True)

Innerhalb des Administrationssystems wird das Feld jedoch nicht angezeigt, obwohl editablees auf gesetzt ist True.

Hat jemand eine Idee?

dotty
quelle

Antworten:

54

Ich glaube, die Vernunft liegt auf dem auto_now_addFeld.

Aus dieser Antwort :

Jedes Feld mit dem Attribut auto_now erbt auch editable = False und wird daher nicht im Admin-Bereich angezeigt.

Auch in den Dokumenten erwähnt :

Wie derzeit implementiert, führt das Setzen von auto_now oder auto_now_add auf True dazu, dass für das Feld editierbar = False und leer = True gesetzt wird.

Dies ist sinnvoll, da es keinen Grund gibt, das Feld bearbeitbar zu machen, wenn es beim Speichern des Objekts mit der aktuellen Datumszeit überschrieben wird.

Shawn Chin
quelle
31
Obwohl Sie sicherlich in der Lage sein sollten, auto_now_addüber den Administrator zu bearbeiten, nachdem der Eintrag zum ersten Mal erstellt wurde?
Christopher Orr
66
Sie sollten es auch einfach in der Administrationsoberfläche anzeigen können, selbst wenn es nicht bearbeitet werden konnte.
Brad
1
In der Antwort von @hunger unten erfahren Sie, wie Sie es als schreibgeschütztes Feld in der Administrationsoberfläche anzeigen.
Guival
1
Es ist sinnvoll, ein Feld bearbeitbar zu machen, wenn das Feld nur bei einer Objekterstellung aktiviert wird (auto_now_add = True).
Sergzach
201

Wenn Sie das Datum wirklich im Admin-Bereich sehen möchten, können Sie readonly_fieldsin admin.py Folgendes hinzufügen :

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

admin.site.register(Rating,RatingAdmin)

Jedes von Ihnen angegebene Feld wird zuletzt nach den bearbeitbaren Feldern hinzugefügt. Um die Reihenfolge zu steuern, können Sie die fieldsOptionen verwenden.

Weitere Informationen finden Sie in den Django-Dokumenten .

Hunger
quelle
32
DAS ist die wahre Antwort !!
GreenAsJade
4
Wenn Sie a festlegen, müssen fieldsSie auch Ihr Feld darin einfügen, damit Sie es sowohl in readonly_fieldsals auch fieldssonst benötigen .
Björn
Ich wollte nur beachten, dass dies auch gilt, wenn Sie verwenden fieldsets, gerade heute auf dieses Problem gestoßen.
Kevin Brown
1
Dadurch wird das Feld nur angezeigt, wenn wir auf einen bestimmten Eintrag klicken und ihn öffnen. Wenn Sie möchten, dass das Feld in der Listenansicht selbst sichtbar ist, dann stackoverflow.com/a/34966908/4440874
Jyotman Singh
1
Beachten Sie, dass ich nicht sicher bin, warum, aber dies scheint für DateTimeFields mit auto_now_add=Trueunter Django 1.9 nicht zu funktionieren . Eine (Art) Problemumgehung besteht darin, sie list_displaystattdessen dem Tupel hinzuzufügen . Bearbeiten: Es funktioniert, wenn Sie Ihr Feld auch zu fields@BjornTipling hinzufügen .
Taylor Edmiston
23

Major Hack:

Wenn Sie dies wirklich tun müssen (wie ich), können Sie es jederzeit umgehen, indem Sie das Feld sofort als "bearbeitbar" festlegen und das Feld wie folgt definieren:

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

Dadurch kann das Feld bearbeitet werden, sodass Sie es tatsächlich ändern können. Es scheint gut zu funktionieren, zumindest mit der MySQL-Backing-Engine. Ich kann für certian nicht sagen, ob andere Sicherungsspeicher diese Daten in der Datenbank unveränderlich machen und somit ein Problem verursachen würden, wenn versucht wird, sie zu bearbeiten. Verwenden Sie sie daher mit Vorsicht .

Brad
quelle
Nein, tu das nicht, benutze die von Hunger beschriebene readonly_fields-Lösung.
GreenAsJade
2
@ GreenAsJade: Eine Begründung wäre schön.
Mhsmith
@mhsmith Begründung, stattdessen die Hunger-Lösung zu verwenden: Da dies ein großer Hack ist und mit "Vorsicht" verwendet wird, verwendet die Hunger-Lösung Django so, wie es verwendet werden soll. Warum würden Sie einen großen Hack riskieren, wenn Sie auf legitime und unterstützte Weise das tun können, was Sie brauchen?
GreenAsJade
6
Diese Hack-Lösung ist nicht so schlecht. Der einzige Anwendungsfall dafür ist jedoch das Testen - wenn der Tester das Datum ändern muss.
Jacoor
2
nur eine
warnung
15

Abhängig von Ihren spezifischen Anforderungen und eventuellen Verhaltensunterschieden können Sie Folgendes tun:

from django.utils.timezone import now

class MyModel(models.Model):
    date = models.DateTimeField(default=now)

Das Standardfeld kann folgendermaßen verwendet werden: https://docs.djangoproject.com/de/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.

Dies kann nicht bearbeitet werden False

Orblivion
quelle
Ich würde from django.utils.timezone import nowanstelle von verwenden datetime.now, aber das sieht vielversprechend aus.
Amjoconn
Danke, ich habe es geändert.
Orblivion
Stackoverflow ist fantastisch, weil einige Antworten Ihnen klar machen, dass Sie nicht die richtige Frage gestellt haben! Danke dir.
Samuel Dauzon
5

Dies hat möglicherweise damit zu tun, dass auto_now_add wahr ist. Anstelle dieses Parameters zum Erfassen des Datums beim Hinzufügen können Sie möglicherweise die Modellspeichermethode überschreiben, um die Datumszeit einzufügen, wenn die ID null ist.

class Rating(models.Model):

    ....
    def save(self, *args, **kwargs)
        if not self.id: 
            self.date = datetime.datetime.now()
Joe J.
quelle
Wenn ja, dann gibt es keinen Grund Feld zu definieren , wie auto_now
Fallenangel
Nicht sicher, warum die Abstimmung; Der erste Link, den Shawn Chin bereitstellt, weist auf einen ähnlichen Ansatz hin.
Joe J
Das ist eine sinnvolle Alternative, vorausgesetzt, es auto_nowwird nicht verwendet und editable=False. +1
Shawn Chin
3

Wenn Sie möchten, dass ein Feld in der Liste aller Ihrer Einträge sichtbar ist (wenn Sie in den Administratoren auf ein Modell klicken) und nicht, wenn Sie diesen bestimmten Eintrag öffnen, dann -

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

admin.site.register(Rating, RatingAdmin)

'name' ist Ihr Hauptfeld oder ein anderes Feld, das Sie im Admin-Bereich anzeigen möchten.

Auf diese Weise können Sie alle Spalten angeben, die Sie anzeigen möchten.

Jyotman Singh
quelle
0

Sie können das nicht tun, überprüfen Sie die Dokumentation

auto_now und auto_now_add sind alle nicht bearbeitbare Felder und können nicht überschrieben werden ...

Gefallener Engel
quelle