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?

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.


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 .


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 .


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


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()

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.


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 ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.