我想确保用户在重定向到下一页之前填写所有字段。如果他们没有填写字段,它应该引发错误,告诉他们在进行之前填充字段。所以,为此,我写下面的代码。但我遇到的问题是,当我没有填写字段时,它将我带到下一页,而不是将它返回到同一页面,并且它没有引起任何错误。
在将用户带到下一页之前,如何让它验证这些字段?
模型
from django.core.exceptions import ValidationError
class Memb(models.Model):
slug=models.CharField(max_length=100)
member=models.CharField(max_length=100)
def __unicode__(self):
return self.member, self.slug
def clean_slug(self):
data=self.cleaned_data['slug']
if "Testy" not in data:
raise ValidationError("Enter the correct name for this field")
class MembForm(ModelForm):
class Meta:
model=Memb
fields=('slug','member')
浏览
def my_memb(request):
if request.method=="POST":
form=MembForm(request.POST)
if form.is_valid():
data=form.cleaned_data
form.save()
return HttpResponseRedirect('/good/')
else:
form=MembForm()
return render_to_response('member.html',{'MembForm':MembForm}, context_instance=RequestContext(request))
模板
{% block content %}
<form action="" method="POST">
{{MembForm.as_p}}
<input type="submit" value="Add"/>
</form>
{% endblock %}
答案 0 :(得分:2)
您似乎只缺少一个标签。即使/good/
返回form.is_valid
,您的代码也会重定向到false
。您只需将重定向代码移动到if子句中,如下所示:
...
if form.is_valid():
data=form.cleaned_data
form.save()
return HttpResponseRedirect('/good/')
...
这应该足够了。
答案 1 :(得分:1)
这里有一些问题,但你最大的问题是你的观点:
浏览
def my_memb(request):
if request.method=="POST":
form=MembForm(request.POST)
if form.is_valid():
data=form.cleaned_data
form.save()
return HttpResponseRedirect('/good/')
else:
form=MembForm()
return render_to_response('member.html',{'MembForm':MembForm}, context_instance=RequestContext(request))
取出if else块:
if request.method=="POST":
form=MembForm(request.POST)
if form.is_valid():
data=form.cleaned_data
form.save()
return HttpResponseRedirect('/good/')
这里发生的是,它会检查表单是否有效。但是,无论它是否有效,你仍然会返回/ good /。这可能不是你想要做的。
你想要做的是:
if request.method=="POST":
form=MembForm(request.POST)
if form.is_valid():
data=form.cleaned_data
form.save()
return HttpResponseRedirect('/good/')
else:
return HttpResponse #something else, or maybe just the form
当然,这可以与下面的代码一起整合,所以你真正需要的是:
if request.method=="POST":
form=MembForm(request.POST)
if form.is_valid():
data=form.cleaned_data # by the way, what is this for? seems extraneous.
form.save()
return HttpResponseRedirect('/good/')
我注意到的其他一些事情:
class MembForm(ModelForm):
class Meta:
model=Memb
fields=('slug','member')
使用模型表单时无需显式定义字段。这是使用它们的全部意义;)有时候这样做,有时候要排除它们,但在你的例子中我没有看到它。
我也不确定“clean_slug”方法是什么让你认为默认功能没有做得更好。但是,这可能只是一个片段。
最后,您将重定向到名为“good”的页面。无论用户输入什么,这都是相同的,你应该问自己这是否是所希望的行为。您可能想要重定向到/ good /(someuniqueid)/
之类的内容