Django 表单 is_valid() 失败

Posted

技术标签:

【中文标题】Django 表单 is_valid() 失败【英文标题】:Django form is_valid() fails 【发布时间】:2012-06-19 18:45:21 【问题描述】:

我是网络开发的真正初学者。以下代码在 is_valid() 检查中失败。但我不明白为什么:表单是否应该从 POST 数据中获取数据?

型号:

class Statement(models.Model):
    text = models.CharField(max_length=255)
    user = models.ForeignKey(User)
    time = models.DateField()
    views = models.IntegerField()

模型形式:

class StatementForm(ModelForm):
    class Meta: 
        model = Statement
        widgets = 
                   'time':forms.HiddenInput(),
                   'user':forms.HiddenInput(), 
                   'views':forms.HiddenInput(), 
        

查看功能:

def new(request):  
    if request.method == 'POST': # If the form has been submitted...
        form = StatementForm(request.POST) # A form bound to the POST data
        if form.is_valid():
            stmt = form.save()
            path = 'stmt/' + stmt.id
            return render_to_response(path, 'stmt': stmt)
    else:  
        c = 
        c.update(csrf(request))
        loggedin_user = request.user 
        d = datetime.now()
        form = StatementForm(request.POST, initial='time': d.strftime("%Y-%m-%d %H:%M:%S"), 'user':loggedin_user, 'views':0)
        return render_to_response('new_stmt.html', 'form': form, ,context_instance=RequestContext(request))

我找到了类似的主题并尝试了很多。这就是我认为它应该工作的方式。我真的需要建议。

【问题讨论】:

转到您之前提出的问题并接受特定问题的最佳答案(如果这些是一个)。您可以通过在答案旁边打勾来做到这一点。 【参考方案1】:

模型的所有字段都是必需的。因此,form.is_valid() 将为 True,如果所有字段都填充了正确的值并且没有空白。 您已将字段 timeuserviews 声明为隐藏字段。您确定已将它们填写在您的模板表格中吗? 此外,您可能希望自动标记字段time = models.DateField()。修改您的模型字段,如

time = models.DateField(auto_now=True)`. 

在此之后您不必在模板表格中自行填写。

您的视图在所有情况下都必须返回 HttpResponse 对象。如果您的表单无效,即如果 form.is_valid() 将返回 False,那么您的视图将不会返回 HttpResponse 对象。这可能是你失败的根源。为if form.is_valid()添加else声明:

from django.http import Http404
def new(request):  
    if request.method == 'POST': # If the form has been submitted...
        form = StatementForm(request.POST) # A form bound to the POST data
        if form.is_valid():
            stmt = form.save()
            path = 'stmt/' + stmt.id
            return render_to_response(path, 'stmt': stmt)
        else:
            # Do something in case if form is not valid
            raise Http404 
    else: 
        # Your code without changes

【讨论】:

谢谢,这显然是对我的代码的改进。对于我的数据库,我需要这种格式的日期:d.strftime("%Y-%m-%d %H:%M:%S")。给定像我这样的特殊格式,是否可以在模型中初始化日期? auto_now 用于DateField 时,具有当前日期的datetime.date 对象作为值传递。而当你需要阅读DateField时,你可以选择任何你喜欢的格式。另外,据我所知,DateField 将仅存储日期,即仅此部分 %Y-%m-%d。如果你需要存储日期和时间,那么你应该使用DateTimeField。看DateField 和DateTimeField。【参考方案2】:

改变这一行:

    form = StatementForm(request.POST, initial='time': d.strftime("%Y-%m-%d %H:%M:%S"), 'user':loggedin_user, 'views':0)

为此:

    form = StatementForm(initial='time': d.strftime("%Y-%m-%d %H:%M:%S"), 'user':loggedin_user, 'views':0)

【讨论】:

等等,这两者有什么区别?我的意思是,我可以看到 Request.POST 丢失了......但这有什么帮助? 回答@bharal - new() 方法有一个条件。它以if request.method == 'POST': process the data... 开头,然后是else(如果方法不是POST,即如果它是GET)。如果它不是POST 方法,那么为什么要包含request.POST(在else 之后,这里就不存在了)?

以上是关于Django 表单 is_valid() 失败的主要内容,如果未能解决你的问题,请参考以下文章

is_valid() vs clean() django 表单

Django 表单验证失败 - pytz 和选择

Django 表单不运行 form.is_valid

Django 消费者(Django 频道)中的表单数据验证(相当于 form.is_valid)

ajax 形式 is_valid 返回 false (django)

django forms is_valid() 方法总是返回 true 如果所有表单字段的要求都是 false