如果form.is_valid()总是false

时间:2017-05-24 07:26:18

标签: django django-forms django-1.11

我正在学习Django 1.11,我正在用widget_tweaks工具创建一个表单。

我有一个变量“代码”,如果表单是否发送,它应该通知模板。 如果未发送,则代码= 1并显示表单 如果显示表单,我只想显示另一个表单(暂时不开发)

问题是,代码总是= 1

为什么?

非常感谢

view.py

#-*- coding: utf-8 -*-
from django.shortcuts import render
from .forms import MinimumRegisterForm

# Create your views here.
def view_about(request):
	return render(request, 'about.html', locals())

def view_first(request):
	return render(request, 'first.html', locals())

def view_second(request):
	form = MinimumRegisterForm()
	if request.method == 'POST':
		form = MinimumRegisterForm(request.POST)
		if form.is_valid():
			identifiant = form.cleaned_data['identifiant']
			email = form.cleaned_data['email']
			password = form.cleaned_data['password']
			confirm_password = form.cleaned_data['confirm_password']
			code = "2"
	else:
		code = "1"
		return render(request, 'second.html', locals())
	return render(request, 'second.html', locals())

模板html

          <div class="inner cover">
            <h1 class="cover-heading">Parlons un peu de vous ...</h1>
            <div class="MinimumRegisterForm">
              {% if form.errors %}
                Les erreurs suivantes sont survenues:
              {{ form.errors }}
              {% endif %}
              {% if code == "1" %}
                <form action="{% url 'second' %}" action="POST">
                  {% csrf_token %}
                  <p>{{ form.identifiant|add_class:"form-control"|attr:"placeholder:Quel sera votre identifiant unique ?" }}</p>
                  <p>{{ form.email|add_class:"form-control"|attr:"placeholder:Indiquez-y votre email !" }}</p>
                  <p>{{ form.password|add_class:"form-control"|attr:"placeholder:Créer votre mot de passe ici." }}</p>
                  <p>{{ form.confirm_password|add_class:"form-control"|attr:"placeholder:Retaper votre mot de passe." }}</p>
                  <input class="btn btn-lg btn-primary" type="submit" value="Continuer">
                </form>
              {% elif code == "2" %}
                 <p>Formulaire suivant</p>
              {% endif %}
              {{ code }}              
            </div>
          </div>

Forms.py

from django import forms

class MinimumRegisterForm(forms.Form):
    identifiant = forms.CharField(
        max_length=50, 
        label="Choisissez un identifiant unique",
    )
    email = forms.EmailField(
        label="Votre adresse mail",
    )
    password = forms.CharField(
        widget=forms.PasswordInput, 
        label="Entrer un mot de passe",
    )
    confirm_password = forms.CharField(
        widget=forms.PasswordInput, 
        label="Confirmer votre mot de passe",
    )

2 个答案:

答案 0 :(得分:4)

使用Django表单的意思是它会告诉你自己的问题是什么。而不是使用无意义的代码&#34;只给你0或1的变量,你应该得到表单在模板中显示它的错误。重新显示表单可以让您的用户有机会修复这些错误。

 <div class="MinimumRegisterForm">
      <p>Formulaire suivant</p>
      {% if form.errors %}
         Les erreurs suivantes sont survenues:
         {{ form.errors }}
      {% endif %}
      <form action="{% url 'second' %}" action="POST">
          {% csrf_token %}
          <p>{{ form.identifiant|add_class:"form-control"|attr:"placeholder:Quel sera votre identifiant unique ?" }}</p>
          <p>{{ form.email|add_class:"form-control"|attr:"placeholder:Indiquez-y votre email !" }}</p>
          <p>{{ form.password|add_class:"form-control"|attr:"placeholder:Créer votre mot de passe ici." }}</p>
          <p>{{ form.confirm_password|add_class:"form-control"|attr:"placeholder:Retaper votre mot de passe." }}</p>
          <input class="btn btn-lg btn-primary" type="submit" value="Continuer">
       </form>
  </div>

答案 1 :(得分:0)

首先,在您的观看form = MinimumRegisterForm()旁边添加def,其次,您必须检查POST请求是否if request.method == 'POST',并且仅在{{1} {{1}在第一次呈现表单时,将数据绑定到表单上会导致错误,因为表单为空但您尝试获取尚未引入的POST数据。

POST

但是,在真实应用中,您不使用from django.shortcuts import render from .forms import MinimumRegisterForm def view_second(request): if request.method == 'POST': form = MinimumRegisterForm(request.POST) if form.is_valid(): identifiant = form.cleaned_data['identifiant'] email = form.cleaned_data['email'] password = form.cleaned_data['password'] confirm_password = form.cleaned_data['confirm_password'] code = "2" form = MinimumRegisterForm() return render(request, 'second.html', {'code': code, 'form': form}) else: form = MinimumRegisterForm() code = "1" return render(request, 'second.html', {'code': code, 'form': form}) code = "1",而只是在模板中显示错误(如果有),如@Daniel Roseman在回复中显示的那样。