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,如果所有字段都填充了正确的值并且没有空白。
您已将字段 time
、user
、views
声明为隐藏字段。您确定已将它们填写在您的模板表格中吗?
此外,您可能希望自动标记字段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 消费者(Django 频道)中的表单数据验证(相当于 form.is_valid)