У меня есть модель, которая выглядит как:Добавление полей в Django ModelForm, которые не являются в модели
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's a problem with your start or end date")
В принципе, я пытаюсь разделите поле DateTime в модели на 3 более удобные для использования поля формы - выбор даты, выпадающее меню и минутное раскрывающееся меню. Затем, как только я получаю три входа, я их собираю в DateTime и сохраняю в модели.
Несколько вопросов:
1) Является ли это совершенно неправильный путь делать это? Я не хочу создавать поля в модели в течение нескольких часов, минут и т. Д., Так как все это всего лишь промежуточные данные, поэтому я хотел бы разбить поле DateTime на подполя.
2) Трудность, с которой я сталкиваюсь, - это когда пустое поле пуста - кажется, что он никогда не проверяется на отсутствие пробелов и просто заканчивается тем, что выпускаете TypeError позже, когда программа ожидает дату и получает Нет. Где Django проверяет пустые входы и поднимает ошибку, которая в конечном итоге возвращается к форме? Это моя ответственность? Если да, то как это сделать, поскольку он не оценивает clean_startdate(), поскольку startdate не находится в модели.
3) Есть ли лучший способ сделать это с наследованием? Возможно, наследуйте MyScheduleForm в BetterScheduleForm и добавьте туда поля? Как мне это сделать? (Я играл с ним более часа и, похоже, не мог его получить)
Спасибо!
[Edit:] Брошенный обратный self.cleaned_data - потерял в копировании/вставке первоначально
В общем, ModelForm может содержать любые поля, которые вы хотите. В этом отношении это похоже на обычную форму. Единственная проблема заключается в том, что вам нужно будет реализовать начальные данные, соответствующие методы clean() и соответствующий метод save(), если эти поля не существуют в модели, поскольку ModelForm пытается автоматически генерировать эти вещи автоматически модель. – Cerin