首先我要说这个问题是基本的,如果我能找到我需要的东西,几乎可以肯定在其他地方得到答案。
我的用户将以一些棘手的格式输入日期,这些日期不会被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, ...)
答案 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也会进行数据库验证。