Django is_valid()在提交表单时抛出ValueError。不知道为什么

时间:2011-03-20 19:24:58

标签: django django-forms validationerror

以下代码基于模型Post创建表单。我面临的问题是,如果我删除if post_form.is_valid():支票,表单永远不会验证并提供 ValueError 数据无法验证

但是,如果我保持代码如下所示,即我保持if post_form.is_valid():检查,那么它总是失败并执行else块。

我试图在我的模型中保存用户,这是一个关于Django的Auth的ForeignKey,但事实证明我甚至无法通过这个vlaidation错误。

任何帮助将不胜感激。感谢。

#----------------------------Model-------------------------------------- 
class Post (models.Model): 
    name = models.CharField(max_length=1000, help_text="required, name of the post") 
    user = models.ForeignKey(User, unique=False, help_text="user this post belongs to") 

    def __unicode__(self): 
        return self.name 

class PostForm(ModelForm): 
    class Meta: 
            model = Post 
#----------------------------./Model--------------------------------------

#----------------------------View-------------------------------------- 
@login_required 
def create_post (request): 
    if request.method == 'POST': 
        post_form = PostForm(request.POST) 
        if post_form.is_valid(): 
            post.save() 
            return render_to_response('home.html') 
        else: 
            return HttpResponse('not working') 
    else: 
        post_form = PostForm() 
        return render_to_response('create.html', {'post_form':post_form }) 
#----------------------------./View--------------------------------------

#----------------------------./Template--------------------------------------
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>home</title>
</head>
<body>
<form method="POST" action='.'>{% csrf_token %}
    <p>{{post_form.name.label_tag}}</p>
    <p>{{post_form.name}}</p>
        <p><input type="submit" value="Submit"/></p>
</form>
</body>
</html>
#----------------------------./Template--------------------------------------

2 个答案:

答案 0 :(得分:3)

在您的其他帖子中,您试图自动插入user字段,这可能意味着您没有在模板中显示user字段。

如果您打算插入用户,请将其排除。

class PostForm(ModelForm): 
    class Meta: 
            model = Post 
            exclude = ('user',) # exclude this

if request.method == 'POST': 
    post_form = PostForm(request.POST) 
    if post_form.is_valid(): 
        post = post.save(commit=False) 
        post.user = request.user
        post.save()  # now post has a user, and can actually be saved.
        return render_to_response('home.html') 

答案 1 :(得分:2)

它显示无效,因为表单无效。据推测,提交表格的人没有填写必填字段。如果您显示form.errors的值,您将看到原因。

或者,尽管我们必须猜测,因为您没有显示模板,但您没有在模板中包含所有必填字段,因此表单永远不会有效。

使用其HttpResponse删除第一个else子句。然后,该视图将默认再次显示该表单,并显示错误。