Eintrag in "models.DateTimeField(auto_now_add=True)" ändern

Django, Flask, Bottle, WSGI, CGI…
Antworten
Pitwheazle
User
Beiträge: 1050
Registriert: Sonntag 19. September 2021, 09:40

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?
einfachTobi
User
Beiträge: 510
Registriert: Mittwoch 13. November 2019, 08:38

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()
Pitwheazle
User
Beiträge: 1050
Registriert: Sonntag 19. September 2021, 09:40

einfachTobi hat geschrieben: Freitag 24. Januar 2025, 13:44
https://www.geeksforgeeks.org/datetimefield-django-models/ hat geschrieben: For DateTimeField: default=datetime.now – from datetime.now()
For DateTimeField: default=timezone.now – from django.utils.timezone.now()
OK, danke - aber das verstehe ich noch nicht ganz. Das sind zwei Möglichkeiten(?). Ich müsste also:

Code: Alles auswählen

    fehler_ab = models.DateTimeField(auto_now_add=True)
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?
einfachTobi
User
Beiträge: 510
Registriert: Mittwoch 13. November 2019, 08:38

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.
Pitwheazle
User
Beiträge: 1050
Registriert: Sonntag 19. September 2021, 09:40

Danke!
letzteres habe ich jetzt gefunden. Das geht mit:

Code: Alles auswählen

class ZaehlerAdmin(admin.ModelAdmin):
    readonly_fields = ["fehler_ab"]
Pitwheazle
User
Beiträge: 1050
Registriert: Sonntag 19. September 2021, 09:40

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

Code: Alles auswählen

zaehler.fehler_ab = timezone.now()
ändert das Datum obwohl das doch eigentlich nicht funktionieren sollte ... habe ich was übersehen?
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pitwheazle: Wieso sollte das nicht funktionieren?
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Pitwheazle
User
Beiträge: 1050
Registriert: Sonntag 19. September 2021, 09:40

__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 :).
Antworten