Python Django中的表单验证无效
我不确定我的表单验证哪里出了问题。。。我还希望显示错误消息,以确定是否成功提交了 目前,我使用的是一个Python Django中的表单验证无效,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我不确定我的表单验证哪里出了问题。。。我还希望显示错误消息,以确定是否成功提交了 目前,我使用的是一个DetailView,用户可以在其中填写BookingForm() forms.py 从django.core.validators导入RegexValidator class BookingForm(forms.Form): Name = forms.CharField() Postcode = forms.CharField(max_length=8,label='Postc
DetailView
,用户可以在其中填写BookingForm()
forms.py
从django.core.validators导入RegexValidator
class BookingForm(forms.Form):
Name = forms.CharField()
Postcode = forms.CharField(max_length=8,label='Postcode')
phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.")
Phone = forms.CharField(max_length=15,validators=[phone_regex],label='Phone')
Date = forms.CharField(max_length=30,label='Date')
Time = forms.CharField(max_length=10,label='Time')
在myviews.py中,我定义了def post
以允许post请求。但是,我总是返回ELSE循环
def post(self,request,**kwargs):
# put your own credentials here
form = BookingForm(self.request.POST)
if form.is_valid():
user_phone = form.cleaned_data['Phone']
postcode = form.cleaned_data['Postcode']
date = form.cleaned_data['Date']
account_sid = "***"
auth_token = "***"
found = Model.objects.get(id=self.kwargs['pk'])
client = Client(account_sid, auth_token)
client.messages.create(
to=Model.phone_number,
from_="+442033225719",
body="You have a new booking." +
"Call phone number:{}. Address: {}. Date:{}"
.format(user_phone,postcode,date))
messages.success(request, 'Your booking was reserved.')
else:
messages.error(request, 'Error occurred.')
return redirect('users:detail', pk=self.kwargs['pk'])
还有我的model_detail.html,它处理表单
进一步编辑:
我使用{%include'booking\u form.HTML%}
创建了以下HTML模板,并将其包含在主模板中:
<!-- Book Now -->
<form action="" method="post">
{{ form.non_field_errors }}
{% csrf_token %}
<div class="boxed-widget">
<h3><i class="fa fa-calendar-check-o "></i> Book Now</h3>
<div class="row with-forms margin-top-0">
<div class="col-lg-6 col-md-12">
{{ form.name.errors }}
<label for="{{ form.name.id_for_label }}">Full Name:</label>
{{ form.name }}
</div>
<div class="col-lg-6 col-md-12">
{{ form.postcode.errors }}
<label for="{{ form.postcode.id_for_label }}">Postcode:</label>
{{ form.postcode }}
</div>
</div>
<div class="row with-forms margin-top-0">
<div class="col-lg-12 col-md-12">
{{ form.name.errors }}
<label for="{{ form.name.id_for_label }}">Full Name:</label>
{{ form.name }}
</div>
</div>
<div class="row with-forms margin-top-0">
<div class="col-lg-6 col-md-12">
{{ form.date.errors }}
<input name="Date" type="text" id="booking-date" data-lang="en" data-large-mode="true" data-min-year="2017" data-max-year="2020">
</div>
<div class="col-lg-6 col-md-12">
{{ form.time.errors }}
<input name="Time" type="text" id="booking-time" value="9:00 am">
</div>
</div>
<!-- progress button animation handled via custom.js -->
<button type="submit" class="progress-button button fullwidth margin-top-5"><span>Book Now</span></button>
</div>
</form>
<!-- Book Now / End -->
无论表单是否有效,您总是在重定向,因此显然您不能显示表单错误。如果希望在模板中显示表单错误,则需要呈现模板并在验证失败时将其作为响应返回-例如,使用基于普通函数的视图(如果坚持使用基于泛型类的视图): 此外,在模板中,您需要使用表单本身,而不是对其进行硬编码
请注意,
消息
框架的消息也没有显示,这肯定是一个配置问题,因此请重新阅读消息
文档并检查您的设置等。无论表单是否有效,您总是在重定向,因此显然不能显示表单错误。如果希望在模板中显示表单错误,则需要呈现模板并在验证失败时将其作为响应返回-例如,使用基于普通函数的视图(如果坚持使用基于泛型类的视图):
此外,在模板中,您需要使用表单本身,而不是对其进行硬编码
请注意,
消息
框架的消息也没有显示,这肯定是一个配置问题,因此请重新阅读消息
文档并检查您的设置等。谢谢,我现在就要阅读。关于硬编码,我这样做是为了设计样式,因为我可以以更好的格式显示它。@Roma您不必完全绕过模板中的表单功能来获得对渲染的完全控制,请参阅我回答中的第二个链接。嗨,Bruno,我试着复制它,但我无法使它仍然工作。我在上面添加了编辑。你会建议我做什么?@Roma:正如医生解释的那样,很快就会变得一团糟。这就是为什么我坚持使用基于函数的视图,除非我有非常令人信服的理由使用CBV(到目前为止只发生过一次,而且我从0.9天起就一直在使用Django)。如果您重新阅读我的答案,您将看到基于规范的“显示一些内容并处理表单”函数的视图非常简单和清晰-唯一重要的一点是仅在表单验证时重定向。我明白了,因此在Else循环中,我将添加object=Model.objects.get(pk=pk),并将其添加到呈现函数的上下文中。我也很好奇如何重定向到同一个页面(因为这是一个详细的视图,在我的例子中是一个教师档案)。我尝试了render(请求“users/teacher_detail.html”,pk=self.kwargs['pk'])来识别正确的老师……谢谢,我现在就要读这篇文章了。关于硬编码,我这样做是为了设计样式,因为我可以以更好的格式显示它。@Roma您不必完全绕过模板中的表单功能来获得对渲染的完全控制,请参阅我回答中的第二个链接。嗨,Bruno,我试着复制它,但我无法使它仍然工作。我在上面添加了编辑。你会建议我做什么?@Roma:正如医生解释的那样,很快就会变得一团糟。这就是为什么我坚持使用基于函数的视图,除非我有非常令人信服的理由使用CBV(到目前为止只发生过一次,而且我从0.9天起就一直在使用Django)。如果您重新阅读我的答案,您将看到基于规范的“显示一些内容并处理表单”函数的视图非常简单和清晰-唯一重要的一点是仅在表单验证时重定向。我明白了,因此在Else循环中,我将添加object=Model.objects.get(pk=pk),并将其添加到呈现函数的上下文中。我也很好奇如何重定向到同一个页面(因为这是一个详细的视图,在我的例子中是一个教师档案)。我尝试了render(请求“users/teacher_detail.html”,pk=self.kwargs['pk'])来识别正确的老师。。。
class TeacherView(generic.DetailView,FormMixin):
model = Teacher
form_class = BookingForm
def post(self,request,**kwargs):
form = BookingForm(self.request.POST)
if form.is_valid():
user_phone = form.cleaned_data['Phone']
account_sid = "***"
auth_token = "***"
teacher = Teacher.objects.get(id=self.kwargs['pk'])
client = Client(account_sid, auth_token)
client.messages.create(
to=teacher.phone_number,
from_="+442033225719",
body=""
messages.success(request, 'Success Message')
return redirect('users:index')
else:
messages.error(request, 'Error occured.')
return redirect("users:index")
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super(TeacherView, self).get_context_data(**kwargs)
# Add extra context from another model
context['form'] = self.get_form()
return context
def myview(request, ...):
if request.method == "POST":
form = MyForm(request.POST):
if form.is_valid():
handle_the_form(...)
messages.success(request, "success message here")
return redirect(where you want to redirect)
else:
# GET, display an empty form
form = MyForm()
return render(request, "mytemplate.html", context={"form":form})