Seite 1 von 1
Eintrag in "models.DateTimeField(auto_now_add=True)" ändern
Verfasst: Freitag 24. Januar 2025, 13:24
von Pitwheazle
Ich habe immer noch Probleme mit dem DateTimeField.
Ich möchte, wenn eine Instanz von "Zaehler" erstellt wird, das aktuelle Datum und die Uhrzeit in "fehler_ab" eintragen:
Code: Alles auswählen
class Zaehler(models.Model):
profil = models.ForeignKey(Profil, verbose_name='Benutzer', related_name='zaehler', on_delete=models.CASCADE)
kategorie = models.ForeignKey(Kategorie, on_delete=models.CASCADE, related_name="zaehler")
...
fehler_ab = models.DateTimeField(auto_now_add=True)
...
... und zu bestimmten Zeiten, wenn die Schülerinnen bzw. der Schüler eine bestimmet Anzahl an Aufgaben richtig gerechnet hat, diesen Zeitpunkt in ebendieses Feld eintragen:
Code: Alles auswählen
if zaehler.richtig_of >= kategorie.eof: # wenn die erforderliche Anzahl richtiger Antworten eingegeben wurde, wird der jeweilige Fehlerzähler zurückgesetzt
if zaehler.fehler_zaehler > 0:
rueckmeldung = rueckmeldung + "<br><b>Herzlichen Glückwunsch: Dein Fehlerzähler wurde zurückgesetzt.</b>"
zaehler.fehler_ab = timezone.now()
... ob das funktioniert weiß ich nicht. Kann dieser Eintrag überschrieben werden? Wenn nein, wie kann ich das ändern?
Ich würde dies ja gerne auf der Adminseite überprüfen, dort wird mir dieses Feld aber nicht angezeigt (wahrscheinlich, weil man es nicht ändern kann/darf?). Wie kann ich es anzeigen lassen?
Re: Eintrag in "models.DateTimeField(auto_now_add=True)" ändern
Verfasst: Freitag 24. Januar 2025, 13:44
von einfachTobi
https://www.geeksforgeeks.org/datetimefield-django-models/ hat geschrieben:
DateTimeField.auto_now_add
Automatically set the field to now when the object is first created. Useful for creation of timestamps. Note that the current date is always used; it’s not just a default value that you can override. So even if you set a value for this field when creating the object, it will be ignored.
If you want to be able to modify this field, set the following instead of auto_now_add=True:
For DateTimeField: default=datetime.now – from datetime.now()
For DateTimeField: default=timezone.now – from django.utils.timezone.now()
Re: Eintrag in "models.DateTimeField(auto_now_add=True)" ändern
Verfasst: Freitag 24. Januar 2025, 13:54
von Pitwheazle
einfachTobi hat geschrieben: ↑Freitag 24. Januar 2025, 13:44
OK, danke - aber das verstehe ich noch nicht ganz. Das sind zwei Möglichkeiten(?). Ich müsste also:
durch
Code: Alles auswählen
fehler_ab = models.DateTimeField( default=datetime.now – from datetime.now())
oder
Code: Alles auswählen
fehler_ab = models.DateTimeField(default=timezone.now – from django.utils.timezone.now()
ersetzen? Das letzte trägt Datum und Uhrzeit entsprechend der eingestellten timezone ein?
... und was passiert mit den bestehenden Einträgen in meiner Datenbank?
... und nochwas: Kann man irgendwie dieses Feld auf der Adminseite anzeigen lassen?
Re: Eintrag in "models.DateTimeField(auto_now_add=True)" ändern
Verfasst: Freitag 24. Januar 2025, 16:50
von einfachTobi
Die obenstehende Beschreibung, dass das als Default einzusetzen ist, zeigt nur auf wo die jeweilige Funktion her kommt. Das gehört natürlich nicht in den Code, weil syntaktisch falsch.
Also, wenn du ohnehin django.utils.timezone.now() verwendest (darauf deutet dein Code oben hin), dann:
Code: Alles auswählen
fehler_ab = models.DateTimeField(default=timezone.now)
Schon bestehende Einträge bleiben erhalten. Du änderst ja nur den Standardwert für neue Einträge.
Von der Adminseite habe ich leider keine Ahnung.
Re: Eintrag in "models.DateTimeField(auto_now_add=True)" ändern
Verfasst: Freitag 24. Januar 2025, 17:30
von Pitwheazle
Danke!
letzteres habe ich jetzt gefunden. Das geht mit:
Code: Alles auswählen
class ZaehlerAdmin(admin.ModelAdmin):
readonly_fields = ["fehler_ab"]
Re: Eintrag in "models.DateTimeField(auto_now_add=True)" ändern
Verfasst: Freitag 24. Januar 2025, 18:09
von Pitwheazle
Hm ... nachdem ich jetzt rausgefunden habe, wie man das Feld "fehler_ab" auf der Adminseite anzeigen kann, habe ich das nochmal ohne Änderung des obenstehenden Codes ausprobiert ...
ändert das Datum obwohl das doch eigentlich nicht funktionieren sollte ... habe ich was übersehen?
Re: Eintrag in "models.DateTimeField(auto_now_add=True)" ändern
Verfasst: Freitag 24. Januar 2025, 18:54
von __blackjack__
@Pitwheazle: Wieso sollte das nicht funktionieren?
Re: Eintrag in "models.DateTimeField(auto_now_add=True)" ändern
Verfasst: Freitag 24. Januar 2025, 19:02
von Pitwheazle
__blackjack__ hat geschrieben: ↑Freitag 24. Januar 2025, 18:54
@Pitwheazle: Wieso sollte das nicht funktionieren?
Na deswegen:
https://www.geeksforgeeks.org/datetimefield-django-models/ hat geschrieben:
DateTimeField.auto_now_add
Automatically set the field to now when the object is first created. Useful for creation of timestamps. Note that the current date is always used;
it’s not just a default value that you can override. So even if you set a value for this field when creating the object, it will be ignored.
If you want to be able to modify this field, set the following instead of auto_now_add=True:
For DateTimeField: default=datetime.now – from datetime.now()
For DateTimeField: default=timezone.now – from django.utils.timezone.now()
Ich hatte das so verstanden, dass man diesen Wert nicht überschreiben kann und er daher auch nicht auf der Adminseite angezeigt wird ... Das heißt aber dann wohl, dass das Feld nur dann nicht geändert werden kann, wenn die Instanz erzeugt wird - später schon. Das wäre prima, dann kann ich damit arbeiten. Der Code sorgt dann demnach schon seit einem halben Jahr für den richtigen Wert

.