自定义模型表单中的日期字段

时间:2014-09-09 06:41:55

标签: django django-models django-forms

首先我要说这个问题是基本的,如果我能找到我需要的东西,几乎可以肯定在其他地方得到答案。

我的用户将以一些棘手的格式输入日期,这些日期不会被DateField的常用验证码识别(例如,2014/4我将要转换为2014-4- 01内部)。我是否需要弄乱代码来清理,验证或两者兼而有之,如果我重新定义这些函数,我是否需要显式调用super?

我的想法是,也许我应该给模型字段和表单字段赋予不同的名称,并在处理表单时以某种方式用表单字段数据填充模型字段......但是如何模糊。

class Person(models.Model):
  (some other fields)
  date_of_arrival = models.DateField(blank=True, null=True)

class ClientForm(forms.ModelForm):
  (some other fields)
  date_of_arrival = forms.DateField(required=False, help_text="Date of arrival in town")
  class Meta:
     model = Person     
     fields = (..., date_of_arrival, ...)

2 个答案:

答案 0 :(得分:0)

$ date = date(' Y-m-d',$ urvalue);

答案 1 :(得分:0)

您需要在表单中实施_clean() method,其中字段的名称位于_之前,因此在您的示例中,它将是date_of_arrival_clean()

在此方法中,执行所有验证。我建议使用dateutil包,它提供parse method,旨在获取可能是日期的字符串,并将其转换为日期。使用这种方法,您不必编写普通逻辑,而是整个方法:

def date_of_arrival_clean(self):
    user_input = self.cleaned_data['date_of_arrival']
    try:
        d = parse(user_input)
    except (ValueError, TypeError):
        raise forms.ValidationError('{} is not a valid date'.format(user_input))
    return user_input
  

我的想法是,也许我应该给出模型字段和表单   字段不同的名称

您不必执行此操作...您可以保留与模型表单中相同的字段,并仍然实现上述_clean()方法。

请记住,如果您的表单是ModelForm,那么当尝试验证表单时,django也会进行数据库验证。