【发布时间】:2011-06-07 15:12:55
【问题描述】:
我有一个看起来像这样的模型:
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) 我遇到的困难是当 startdate 字段为空白时——似乎它永远不会被检查为非空白,并且稍后当程序需要一个日期并获取时最终抛出一个 TypeError没有。 Django 在哪里检查空白输入,并引发最终返回表单的错误?这是我的责任吗?如果是这样,我该怎么做,因为它不评估 clean_startdate() 因为 startdate 不在模型中。
3) 有没有更好的方法通过继承来做到这一点?也许继承 BetterScheduleForm 中的 MyScheduleForm 并在那里添加字段?我该怎么做? (我已经玩了一个多小时,似乎无法理解)
谢谢!
[编辑:] 没有返回 self.cleaned_data -- 原来在复制/粘贴中丢失了
【问题讨论】:
-
一般来说,ModelForm 可以包含你想要的任何字段。在这方面,它就像一个正常的表格。唯一需要担心的是,如果模型中不存在这些字段,您将需要实现初始数据、适当的 clean() 方法和适当的 save() 方法,因为 ModelForm 会尝试使用自动神奇地生成这些东西模型。
标签: python django django-forms