我有一个带有非常基本模型和表单的小型Django应用程序,其中给我提出问题的元素是DateTimeField
。
型号:
class Task(models.Model):
what = models.CharField(max_length=255)
due = models.DateTimeField(null=True, blank=True)
#[...]
形式:
class TaskForm(forms.Form):
due = forms.DateTimeField(required=False)
在视图中,POST
:
form = TaskForm(request.POST)
if form.is_valid():
# further processing
# create new task or edit existing task, for example:
new_task = Task('what':request.POST['what'],
'due':request.POST['due'])
new_task.save()
在模板中,为了显示DateTimeField
,我使用的是bootstrap datetimepicker,效果很好。
问题是我似乎无法为Django选择正确的格式。形成我读过的任何以下格式应该没问题。
[
'%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
'%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200'
'%Y-%m-%d %H:%M', # '2006-10-25 14:30'
'%Y-%m-%d', # '2006-10-25'
'%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59'
'%m/%d/%Y %H:%M:%S.%f', # '10/25/2006 14:30:59.000200'
'%m/%d/%Y %H:%M', # '10/25/2006 14:30'
'%m/%d/%Y', # '10/25/2006'
'%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59'
'%m/%d/%y %H:%M:%S.%f', # '10/25/06 14:30:59.000200'
'%m/%d/%y %H:%M', # '10/25/06 14:30'
'%m/%d/%y', # '10/25/06'
]
但是当我选择DateTime与DateTimePicker时,它不被接受。
我从Django收到ValidationError
。据我所知,它不是来自.is_valid()
,而是来自.save()
函数。
['„“ value has an invalid format and must be of the form YYYY-MM-DD HH: MM [: ss [.uuuuuuu]] [TZ]']
我找不到罪魁祸首,因为它似乎是""
。我怎样才能缩小问题范围?
答案 0 :(得分:2)
出于某种原因,在验证和清理数据之后,您忽略了所有这些工作并直接回到原始数据。别这么做。
首先,您应该始终在表单cleaned_data
dict验证后访问数据。这将包含已正确转换为正确数据类型的数据,在本例中为datetime。
new_task = Task('what': form.cleaned_data['what'],
'due': form.cleaned_data['due'])
(您应该确保您的TaskForm也包含what
字段。)
但实际上Django比这更容易。如果你让你的表单继承自ModelForm,并添加一个带有model = Task
的内部Meta类,你只需执行form.save()
即可为你创建任务。
答案 1 :(得分:0)
除Daniel Roseman's answer之外,您还可以将格式传递给DateTime小部件,以便它可以正确解析它
due = forms.DateTimeField(required=False,
widget=forms.DateTimeField(format='%Y-%m-%d %H:%M:%S', input_formats=['%Y-%m-%d %H:%M:%S'])
# use whichever formats you want.
# format is the format needed by the frontend,
# & input_formats is a list of possible input formats that need to be parsed
或者你可以从前端返回django想要的格式 我相信bootstrap datetimepicker允许pass format as an option。如果需要,以下是supported formats的列表。