Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django';具有HiddenInput的s ModelForm返回无效的_Python_Django_Django Forms - Fatal编程技术网

Python Django';具有HiddenInput的s ModelForm返回无效的

Python Django';具有HiddenInput的s ModelForm返回无效的,python,django,django-forms,Python,Django,Django Forms,我正在做一个学习Django的小项目,在尝试使用模型表单中的隐藏字段时遇到了一些问题 这是一门课: class Post(models.Model): title = models.CharField(max_length = 140) message = models.CharField(max_length = 10000) pub_date = models.DateTimeField() 以及我的模型: class PostForm(M

我正在做一个学习Django的小项目,在尝试使用模型表单中的隐藏字段时遇到了一些问题

这是一门课:

class Post(models.Model):
    title       = models.CharField(max_length = 140)
    message     = models.CharField(max_length = 10000)
    pub_date    = models.DateTimeField()
以及我的模型:

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>

标题:
信息:
ASD11111111
我使用相同的模板创建和编辑帖子。创建时,发布日期在另一个视图中设置,编辑时,无法更改模板上的发布日期(因此隐藏字段)。 在本例中,
form.is\u valid()
始终返回False。 如果我从表单中删除
'pub_date':HiddenInput(),
行,它将返回True。
我做错了什么?

你想让发布日期成为帖子的日期吗? 那么,您现在在您的车型中尝试过auto_了吗

pub_date    = models.DateTimeField(auto_now=True)

问题在于从字符串到datetime对象的转换

如果未指定
input\u formats
参数,则datetime字段将采用这些格式进行字符串->日期时间转换

(来自文件:)

所以你的
2010-12-19 17:08:22.498000
值不起作用

DateTimeField
的默认窗口小部件是
DateTimeInput
窗口小部件,它将
datetime
正确地格式化为字符串,但
HiddenInput
只接受datetime对象,而不使用所示格式

如果要使用
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;'}),
        }

另一种选择是将小部件类型更改为SplitHiddenDateTimeWidget

生成页面的HTML是什么(带有隐藏字段)?Ops,忘记在问题中添加它了。完成。如果打印“form.errors”,您会看到什么?它说:
  • 数据发布
    • 输入有效的日期输入法。
我不知道这是可能的,我对python和django有点陌生。但当我更新帖子时,这会改变吗--算了吧,我刚读到关于汽车的文章,谢谢你的回答。在这种情况下,我将使用auto_now和auto_now添加解决方案。如果我想格式化时间,我应该在哪里做?我不能在视图中这样做,因为表单已经无效。没问题!嗯,我不知道如何在视图中更改它。我认为最好不要使用HiddenInput并让DateTimeInput处理格式设置,但是如果您想在视图中使用它,可以尝试将模型实例的发布日期重写为myinstance.pub\u date.strftime(“%Y-%m-%d%H:%m:%s”),但我不知道这是否有效,或者表单是否再次调用DB
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;'}),
        }