带有HiddenInput的Django的ModelForm返回无效
作者:互联网
我正在做一个学习Django的小项目,并且在尝试使用ModelForm内部的隐藏字段时遇到了一些问题.
Theres类:
class Post(models.Model):
title = models.CharField(max_length = 140)
message = models.CharField(max_length = 10000)
pub_date = models.DateTimeField()
而我的ModelForm:
class PostForm(ModelForm):
class Meta:
model = Post
fields = ('title', 'message', 'pub_date',)
widgets = {
'message' : Textarea(attrs={'cols':80, 'rows':20}),
'pub_date' : HiddenInput(),
}
这是视图:
def edit(request, post_id):
if request.method == 'POST':
form = PostForm(request.POST, request.FILES)
if form.is_valid():
print 'VALID'
dados = form.cleaned_data
post = Post.objects.get(pk=post_id)
post.title = dados['title']
post.message = dados['message']
post.save()
return HttpResponseRedirect(reverse('blog.views.detail', args=(post.id,)))
else:
print 'INVALID'
form = PostForm(instance=Post.objects.get(pk=post_id))
return render_to_response('blog/add_post.html', {'form' : form,}, context_instance = RequestContext(request))
这是为表单生成的HTML:
<div style='display:none'>
<input type='hidden' name='csrfmiddlewaretoken'
value='3b7c0735bf464fb4fd7dcd3011050e1c' />
</div>
<tr>
<th><label for="id_title">title:</label></th>
<td><input id="id_title" type="text" name="title" value="asd1111111111" maxlength="140" /></td>
</tr>
<tr>
<th><label for="id_message">message:</label></th>
<td><textarea id="id_message" rows="20" cols="80" name="message">asd11111111111</textarea>
<input type="hidden" name="pub_date" value="2010-12-19 17:08:22.498000" id="id_pub_date" /></td>
</tr>
我使用相同的模板来创建和编辑帖子.在创建时,在另一个视图中设置了pub_date,在进行编辑时,我无法在模板上更改pub_date(因此是隐藏字段).
在此示例中,form.is_valid()始终返回False.
如果我从表单中删除’pub_date’:HiddenInput()行,则返回True.
我究竟做错了什么?
解决方法:
问题在于从字符串到datetime对象的转换.
如果未指定input_formats参数,则datetime字段将采用这些格式进行字符串-> datetime转换.
(从文档:http://docs.djangoproject.com/en/dev/ref/forms/fields/#datetimefield)
'%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
'%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', # '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', # '10/25/06 14:30'
'%m/%d/%y', # '10/25/06'
因此,您的2010-12-19 17:08:22.498000值将无效.
DateTimeField的默认小部件是DateTimeInput小部件,它可以将日期时间正确地格式化为字符串,但是HiddenInput只是采用没有格式化的日期时间对象,如您所示.
如果要使用HiddenInput,则需要strftime将datetime对象设置为正确的格式.
如果您只想隐藏它,则另一种选择是不将窗口小部件设置为HiddenInput,而仅将DateTimeInput小部件保持不变,并使用attrs参数隐藏该元素.
class PostForm(ModelForm):
class Meta:
model = Post
fields = ('title', 'message', 'pub_date',)
widgets = {
'message' : Textarea(attrs={'cols':80, 'rows':20}),
'pub_date' : DateTimeInput(attrs={'style': 'display:none;'}),
}
标签:django-forms,python,django 来源: https://codeday.me/bug/20191208/2094835.html