Python Django models.DateField hat als Ausgabe immer noch die Zeit mit dabei

HeinzM

Ensign
Registriert
Apr. 2004
Beiträge
186
Hallo zusammen,

ich wollte mich mal wieder in was neuem Probieren und erstelle gerade mit Django eine Fahrtenbuch-App.

Das Model für eine Fahrt sieht so aus
Python:
class Ride(models.Model):
start_date = models.DateField('Startdatum', default=date.today)
start_time = models.TimeField('Startzeit')
end_date = models.DateField('Enddatum', default=date.today)
end_time = models.TimeField('Zielzeit')
    route_description = models.TextField()
distance = models.DecimalField(max_digits=4, decimal_places=1)
ride_refund = models.DecimalField(max_digits=5, decimal_places=2)
vehicle = models.ForeignKey('vehicles.Vehicle', on_delete=models.CASCADE, blank=True)
created_at = models.DateTimeField(default=timezone.now)

Die Darstellung in der Website ist
Django-Datefield.png

Ich habe in settings.py auch einen Eintrag zu DATE_FORMAT = "%d/%m/%Y" gemacht. Leider ebenfalls ohne Erfolg.
Kann es ggf. mit der Datenbank zusammenhängen? Ich konnte für sqlite kein Datefield finden. Aber ich bin davon ausgegangen das Django intern dann die Datenbankdaten zu dem gewünschten Ergebnis wandelt. Dem ist aber auch nicht so.
Hat jemand vielleicht einen Tip, wie ich die 00:00:00 in dem Feld wegbekomme?

--edit--
Ich verwende:
Django 5.0.1
pip 23.3.1
python 3.11.7
setuptools 69.0.3
wheel 0.42.0
--edit--

Viele Grüße
Heinz
 
Zuletzt bearbeitet:
from django.db import models
from datetime import date
from django.utils import timezone

class Ride(models.Model):
start_date = models.DateField('Startdatum', default=date.today)
start_time = models.TimeField('Startzeit')
end_date = models.DateField('Enddatum', default=date.today)
end_time = models.TimeField('Zielzeit')
route_description = models.TextField()
distance = models.DecimalField(max_digits=4, decimal_places=1)
ride_refund = models.DecimalField(max_digits=5, decimal_places=2)
vehicle = models.ForeignKey('vehicles.Vehicle', on_delete=models.CASCADE, blank=True)
created_at = models.DateTimeField(default=timezone.now)

def str(self):
start_date_str = self.start_date.strftime('%d/%m/%Y')
end_date_str = self.end_date.strftime('%d/%m/%Y')
return f"{start_date_str} {self.start_time} - {end_date_str} {self.end_time}"
 
Hallo Klaus,

Vielen Dank für deinen Vorschlag,
hier verändert sich nur die Darstellung des Models z.B. in einer Auflistung.
An dem konkreten Feld, welches im Screenshot zu sehen ist, ändert sich nichts.
Also der Default-Value bleibt immer noch in dem DateTime-Format.

VG
Ergänzung ()

Hallo Klaus,

mit deiner Antwort hab ich gerade noch bissl rumgespielt.

Python:
class Ride(models.Model):
    start_date = models.DateField('Startdatum', default=date.today().strftime('%d.%m.%Y'))
    start_time = models.TimeField('Startzeit')
    end_date = models.DateField('Enddatum', default=date.today().strftime('%d.%m.%Y'))
    end_time = models.TimeField('Zielzeit')
    route_description = models.TextField()
    distance = models.DecimalField(max_digits=4, decimal_places=1)
    ride_refund = models.DecimalField(max_digits=5, decimal_places=2)
    vehicle = models.ForeignKey('vehicles.Vehicle', on_delete=models.CASCADE, blank=True)
    created_at = models.DateTimeField(default=timezone.now)

Die Ausgabe ist jetzt:
django_Darstellung_korrekt.png


Vielen Dank für den Austausch.

Schönen Abend noch.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: klausk1978
Ich würde davon abraten, Datum und Zeit im Model zu trennen. Queries nach Fahrten innerhalb eines Zeitraums mit Uhrzeit oder ein Constraint end>=start würden dadurch ungemein erschwert. Stattdessen sollte es im Frontend getrennt werden, was aber auch eher tricky ist.

Django Forms verwende ich nie (nur Django Admin und/oder Django Rest Framework mit Single Page Application), deswegen kann ich da nicht wirklich helfen, aber als Hinweis: die Widgets für Datum und Uhrzeit haben ein Format-Attribut, was ein besserer Ansatz für die gewünschte Formatierung sein dürfte. Aber eigentlich will man ein Input vom Typ datetime-local, also vielleicht das Template anpassen.

Bei created_at kann auto_now_add=True statt default verwendet werden.

Bei Start und Ende bin ich überrascht, dass als default ein String funktioniert. Zudem muss default eine Funktion oder ein Lambda sein, ansonsten bekommt man immer den Wert, der evaluiert wurde, als die Python-Datei geladen wurde.
 
Zuletzt bearbeitet:
Zurück
Oben