У меня есть модель, которая выглядит так:
class MySchedule(models.Model):
start_datetime=models.DateTimeField()
name=models.CharField('Name',max_length=75)
С его помощью появляется ModelForm:
class MyScheduleForm(forms.ModelForm):
startdate=forms.DateField()
starthour=forms.ChoiceField(choices=((6,"6am"),(7,"7am"),(8,"8am"),(9,"9am"),(10,"10am"),(11,"11am"),
(12,"noon"),(13,"1pm"),(14,"2pm"),(15,"3pm"),(16,"4pm"),(17,"5pm"),
(18,"6pm"
startminute=forms.ChoiceField(choices=((0,":00"),(15,":15"),(30,":30"),(45,":45")))),(19,"7pm"),(20,"8pm"),(21,"9pm"),(22,"10pm"),(23,"11pm")))
class Meta:
model=MySchedule
def clean(self):
starttime=time(int(self.cleaned_data.get('starthour')),int(self.cleaned_data.get('startminute')))
return self.cleaned_data
try:
self.instance.start_datetime=datetime.combine(self.cleaned_data.get("startdate"),starttime)
except TypeError:
raise forms.ValidationError("There a problem with your start or end date")
В принципе, я пытаюсь сломать поле DateTime в модели на 3 более удобных для использования поля формы - выбор даты, выпадающее меню и минутное раскрывающееся меню. Затем, как только я получил три входа, я снова их собираю в DateTime и сохраняю в модели.
Несколько вопросов:
1) Не совсем ли это так? Я не хочу создавать поля в модели в течение нескольких часов, минут и т.д., Так как все это в основном только промежуточные данные, поэтому я хотел бы разбить поле DateTime на подполя.
2) Трудность, с которой я сталкиваюсь, заключается в том, что поле startdate пустое - кажется, что он никогда не проверяется на отсутствие пробелов и просто заканчивается тем, что он запускает TypeError позже, когда программа ожидает дату и получает Никто. Где Django проверяет пустые входы и поднимает ошибку, которая в конечном итоге возвращается к форме? Это моя ответственность? Если да, то как это сделать, поскольку он не оценивает clean_startdate(), поскольку startdate не находится в модели.
3) Есть ли лучший способ сделать это с наследованием? Возможно, наследуйте MyScheduleForm в BetterScheduleForm и добавьте туда поля? Как мне это сделать? (Я играю с ним более часа и, похоже, не могу получить его)
Спасибо!
[Edit:] Отключен возврат self.cleaned_data - потерял его в оригинале copy/paste