2017-09-15 69 views
0

我不知道我在哪里出错了表单验证...我还想显示错误消息是否已成功提交。表单验证不工作Django

目前,我使用的是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') 

在我意见.py我定义了def 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其处理形式。

进一步编辑:

我创建了下面的HTML模板,我包括使用{% include 'booking_form.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 --> 

我在forms.py BookingForm保持不变。但是,现在,我看不到要输入的字段。我假设这是因为表单没有传递到模板中。

的的DetailView我views.py全部内容:

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 

回答

1

你总是重定向,形式是否有效与否,所以很明显你不能有显示表单错误。如果你想要在你的模板中显示表单错误,你需要渲染模板并在验证失败时将其作为响应返回 - 例如使用普通的基于功能的视图(如果你坚持使用通用的基于类的视图,那么use a FormMixin with your DetailView ):

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

另外,在您的模板,你需要使用的形式本身,而不是硬编码,as explained here in the FineManual的。

WRT /的messages框架的消息没有显示任何,这无疑是一个配置的问题,所以重读messages doc和检查设置等

+0

谢谢,我要去刚才读这一点。关于硬编码,我是为了造型而做的,因为我可以以更好的格式显示它。 – Roma

+0

@Roma您不必完全绕过模板中的表单功能来完全控制渲染,请参阅我的答案中的第二个链接。 –

+0

嗨布鲁诺,我试图复制此https://docs.djangoproject.com/en/1.11/topics/class-based-views/mixins/,但我无法设法让它仍然工作。我添加了上面的编辑。你会推荐我做什么? – Roma