2012-06-17 48 views
6

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

型号:

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

的ModelForm:

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

View功能:

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)) 

我发现了类似的主题,并尝试了很多。这是我认为它应该工作。我真的需要建议。

+4

转到你是否在接受最佳答案(如果这些是一个)特定问题前面的问题。您可以通过在答案旁放置复选标记来完成此操作。 –

回答

5

需要模型的所有领域。因此,如果所有字段都填充了正确的值并且没有空白,则form.is_valid()将为真。 您已声明字段timeuserviews为隐藏字段。你确定,你已经填写了你的模板表单吗? 此外,你可能想要自动戳。修改您的模型字段,如

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

之后,您不必自己填写模板形式。

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

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 
+0

谢谢,这显然是我的代码的改进。对于我的数据库,我需要这种格式的日期:d.strftime(“%Y-%m-%d%H:%M:%S”)。鉴于我的特殊格式,是否可以在模型中初始化日期? – JoeFox

+1

对'DateField'使用'auto_now'时,具有当前日期的'datetime.date'对象作为值传递。当你需要阅读'DateField'时,你可以选择任何你喜欢的格式。此外,据我所知,“DateField”将只存储日期,即只存储该部分“%Y-%m-%d”。如果你需要存储日期和时间,那么你应该使用'DateTimeField'。查看[DateField](https://docs.djangoproject.com/en/dev/ref/models/fields/#datefield)和[DateTimeField](https://docs.djangoproject.com/zh/dev/ref/models /场/#DateTimeField字段)。 – stalk

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}) 
+0

谢谢,这为我做了这份工作。 – JoeFox

+2

等,两者有什么不同?我的意思是,我可以看到Request.POST已丢失......但这有什么用? – bharal