2017-09-15 1 views
0

Je ne suis pas sûr où je vais mal avec la validation de formulaire ... Je veux aussi afficher les messages d'erreur que le for a été soumis avec succès ou non.Validation de formulaire ne fonctionnant pas Django

Actuellement, je suis sur un DetailView, où une personne peut remplir un BookingForm()

forms.py de django.core.validators importer 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') 

Dans mes vues .py J'ai défini def post pour autoriser les demandes de publication. Cependant, je reçois toujours la boucle ELSE est retourné

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']) 

Et mon model_detail.html qui gère la forme.

EDIT DE PLUS:

J'ai créé le modèle HTML suivant que j'inclus dans le modèle principal à l'aide {% 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 --> 

Mon bookingform dans forms.py est resté inchangé. Cependant, maintenant, je ne vois pas de champs à saisir. Je suppose que c'est parce que le formulaire n'est pas passé dans le modèle.

contenu complet de mon views.py du DetailView:

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 

Répondre

1

Vous êtes toujours réoriente, si la forme est valide ou non, de sorte que vous ne peut évidemment pas les erreurs de forme affichées. Si vous souhaitez que les erreurs de formulaire apparaissent dans votre modèle, vous devez afficher le modèle et le renvoyer comme réponse lorsque la validation échoue - exemple avec une vue basée sur une fonction standard (si vous insistez pour utiliser des vues génériques basées sur des classes 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}) 

également dans votre modèle, vous devez utiliser le formulaire lui-même au lieu de coder en dur, as explained here in the FineManual.

WRT/les messages cadre messages ne montre pas non plus, cela est certainement un problème de configuration, donc relire le messages doc et vérifiez vos paramètres, etc.

+0

Merci, je vais lire tout à l'heure. En ce qui concerne le codage en dur, je l'ai fait pour le stylisme, car je peux l'afficher dans un format plus agréable. – Roma

+0

@Roma vous n'avez pas à contourner complètement la fonctionnalité du formulaire dans votre modèle pour obtenir un contrôle total sur le rendu, cf le deuxième lien dans ma réponse. –

+0

Salut Bruno, j'ai essayé de reproduire ce https://docs.djangoproject.com/fr/1.11/topics/class-based-views/mixins/, mais je n'arrive pas à le faire fonctionner encore. J'ai ajouté l'édition ci-dessus. Que me recommanderiez-vous de faire? – Roma