Нужна помощь в виджетах форм 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 фреймворк, если вы хотите сохранить одно временное поле данных.

Вернуться на верх