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