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
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
@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. –
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