Нужна помощь в виджетах форм django
Я нахожусь в середине проекта. Мне нужна помощь в использовании виджетов. У меня есть модель, для которой я хочу создать форму модели: Моя модель :
class Appointments(models.Model):
doctor = models.ForeignKey(Doctor, on_delete=models.CASCADE)
patient = models.ForeignKey(Patient, on_delete=models.CASCADE)
app_time = models.DateTimeField()
diognoses = models.TextField(max_length=1000, null=True, blank=True)
prescriptions = models.TextField(max_length=250, null=True, blank=True)
class Meta:
unique_together = ('doctor', 'patient', 'app_time')
def __str__(self):
st = str(self.patient.user.name)+str(self.doctor.user.name)
return st
Соответствующая модельная форма :
class AppointmentBookForm(forms.ModelForm):
app_time = forms.DateTimeField(widget=forms.SplitDateTimeWidget())
class Meta:
model = Appointments
fields = ['doctor','app_time']
Теперь для app_time я разделил поле даты и времени, которое уже работает нормально. Теперь мне нужен выпадающий список для даты и подходящий виджет для времени. Время должно содержать только часы и минуты. И наконец, я также хочу предоставить опции для выбора времени в зависимости от даты и доктора.
Для простого html самым простым способом может быть определение двух полей ввода, одно для времени, другое для даты.
Input type="date": https://www.w3schools.com/tags/att_input_type_date.asp
Input type="time": https://www.w3schools.com/tags/att_input_type_time.asp
На это есть несколько результатов, вот одно предложение:
models.py
from datetime import datetime
class Appointments(models.Model):
doctor = models.ForeignKey(Doctor, on_delete=models.CASCADE)
patient = models.ForeignKey(Patient, on_delete=models.CASCADE)
time = models.TimeField()
date = models.DateField()
app_time = models.DateTimeField()
diognoses = models.TextField(max_length=1000, null=True, blank=True)
prescriptions = models.TextField(max_length=250, null=True, blank=True)
def save(self, *args, **kwargs):
self.app_time = datetime.combine(self.date, self.time)
super().save(*args, **kwargs)
class Meta:
unique_together = ('doctor', 'patient', 'app_time')
def __str__(self):
st = str(self.patient.user.name)+str(self.doctor.user.name)
return st
forms.py
class AppointmentBookForm(forms.ModelForm):
class Meta:
model = Appointments
fields = ['doctor', 'time', 'date']
"""
# Optional: Define dedicated types or classes for the single fields
widgets = {
'time': forms.DateField(attr={"class": "myclass", "type": "time"})
}
"""
В данном случае app_time является излишним. Вы также можете определить свойство для получения времени даты:
class Appointments(models.Model):
doctor = models.ForeignKey(Doctor, on_delete=models.CASCADE)
patient = models.ForeignKey(Patient, on_delete=models.CASCADE)
time = models.TimeField()
date = models.DateField()
diognoses = models.TextField(max_length=1000, null=True, blank=True)
prescriptions = models.TextField(max_length=250, null=True, blank=True)
@property
def app_time(self):
return datetime.combine(date, time)
class Meta:
unique_together = ('doctor', 'patient', 'time', 'date')
def __str__(self):
st = str(self.patient.user.name)+str(self.doctor.user.name)
return st
пример:
appointment = Appointments.objects.first()
print(appointment.app_time)
В качестве альтернативы используйте какой-нибудь хороший front-end фреймворк, если вы хотите сохранить одно временное поле данных.