Tengo un formulario simple y cada vez que el usuario hace algo mal en el formulario, me gustaría generar un error de validación en Django. El problema es que configuré la validación del formulario, pero cuando el formulario se envía con valores incorrectos, se procesa. Me preguntaba por qué está sucediendo y cómo puedo evitarlo.
Aquí está el formulario html:
<form id="ask-project" method="post" action="{% url 'ask-project' %}"> {% csrf_token %} <input required="required" class="form-control form-text required" id="prenom" name="prenom" type="text"> <button class="btn btn-default submit">Submit</button> </form>vistas.py:
def askProject(request): if request.method == 'POST': form = AskProjectForm(request.POST) if form.is_valid(): save_it = form.save(commit=False) save_it.save() return redirect('/merci/') #successformularios.py:
class AskProjectForm(forms.ModelForm): class Meta: model = AskProject fields = ['prenom'] def clean_prenom(self): prenom = self.cleaned_data['prenom'] if len(prenom) < 3: raise ValidationError('Votre prénom doit etre plus long que 1 caractère.') return prenom¿Estoy haciendo algo mal?
Con el patrón que está utilizando, este tipo de problema es inevitable y está a la orden del día. Lo primero es no representar el formulario manualmente como parece que lo está haciendo. Eso significa que no está mostrando ningún comentario cuando el usuario ingresa datos no válidos. Considere usar {{ form }} , {{ form.as_table }} etc. o representar los campos con toda la información como se describe aquí: https://docs.djangoproject.com/en/1.11/topics/forms/#rendering-fields- a mano
El segundo problema es que está redirigiendo cuando se envía el formulario, independientemente de si es válido o no. El patrón recomendado es redirigir solo cuando el formulario es válido. Entonces, incluso si aplica la sugerencia en el primer párrafo, todavía no está recibiendo la retroalimentación requerida. Considere implementar el formulario como se sugiere en el manual. Sigue una copia directa del pasado
if request.method == 'POST': # create a form instance and populate it with data from the request: form = NameForm(request.POST) # check whether it's valid: if form.is_valid(): # process the data in form.cleaned_data as required # ... # redirect to a new URL: return HttpResponseRedirect('/thanks/') # if a GET (or any other method) we'll create a blank form else: form = NameForm() return render(request, 'name.html', {'form': form})Finalmente, yendo al caso específico de por qué la validación de su formulario no funciona, agregue una declaración de impresión en su método limpio para imprimir tanto la cadena como su longitud, ver si coincide (o si incluso se llama a su método)