python - 将不在模型中的字段添加到 Django ModelForm

标签 python django django-forms

我有一个看起来像这样的模型:

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(),因为开始日期不在模型中。

3) 是否有更好的方法通过继承来做到这一点?也许继承 BetterScheduleForm 中的 MyScheduleForm 并在那里添加字段?我该怎么做? (我已经玩了一个多小时了,但似乎无法理解)

谢谢!

[编辑:] 遗漏了 return self.cleaned_data —— 最初在复制/粘贴中丢失了它

最佳答案

  1. 如果我是你,我会使用 customised Django-admin date/time widget(s)用于输入日期/时间条目。

  2. 关于表单验证,请确保您传递与请求关联的表单,以显示基于表单的错误。 (下面的示例代码)

  3. 至于使用继承,对于这个用例来说有点矫枉过正,因为它不会起到任何作用,最好让事情保持简单。

示例代码:

if request.POST:
    form = MyScheduleForm(request.POST)
    if form.is_valid():
        # Specific stuff with the variables here
        pass
else:
    form = MyScheduleForm()

关于python - 将不在模型中的字段添加到 Django ModelForm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4665719/

相关文章:

django - 如何管理 Django urls 别名重定向?

django - 提高forms.ValidationError不能在自定义模板形式下工作

python - 创建一个 Django Form 来保存两个模型

Python 监督机器学习

python - UHF RFID 阅读器和 Python

python - 将新类生成到命名空间的装饰器

python - 如何使用django-ckeditor在管理员中上传服务器上的文件和浏览器文件?

python - 被一些机器人攻击

python - modelformset __iter__ 重载问题

python - 使用 Python 为 Sensu 创建一个 tty