2017-05-24 61 views
0

我正在學習Django 1.11,我正在用widget_tweaks工具創建表單。if form.is_valid()always false

我有一個變量「代碼」,應該通知模板,如果表單是否發送。 如果它不發送,代碼= 1的形式顯示 如果顯示的形式,我只是想顯示另一種形式(目前未開發)

的問題是,代碼總是= 1

爲什麼?

非常感謝

view.py

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

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

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

 
def view_second(request): 
 
\t form = MinimumRegisterForm() 
 
\t if request.method == 'POST': 
 
\t \t form = MinimumRegisterForm(request.POST) 
 
\t \t if form.is_valid(): 
 
\t \t \t identifiant = form.cleaned_data['identifiant'] 
 
\t \t \t email = form.cleaned_data['email'] 
 
\t \t \t password = form.cleaned_data['password'] 
 
\t \t \t confirm_password = form.cleaned_data['confirm_password'] 
 
\t \t \t code = "2" 
 
\t else: 
 
\t \t code = "1" 
 
\t \t return render(request, 'second.html', locals()) 
 
\t 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", 
 
    )

+0

任何'form.errors'?.. – Sayse

+0

對不起,我是在Django一個小白,我真的不知道什麼是form.errors ... – GrandGTO

+0

@GrandGTO我已經更新了我的答案 – doru

回答

0

首先,加form = MinimumRegisterForm()右波紋管你的看法def,其次,你要檢查,如果是一個POST要求if request.method == '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"and code = "2",而不是隻顯示錯誤(如果有的話)模板類似@Daniel羅斯曼表示他的迴應。

+0

好我理解這段代碼的邏輯。 但是,現在我的變量代碼不用於報告錯誤,而是報告表單是否被髮送。 如果發送它,代碼= 2,模板顯示另一種形式,如果不是,代碼= 1,並顯示MinimumRegisterForm。 問題是,即使我發送表單,代碼總是= 1。爲什麼? – GrandGTO

+0

@GrandGTO我已經更新了答案,而bty發送的消息應該/可以使用['messages'](https://docs.djangoproject.com/en/1.11/ref/contrib/messages/)框架。 – doru

+0

消息將發送消息給用戶。我只是想把我的var「code」變成2,儘管是「1」。 – GrandGTO

4

使用Django表單的一點是,它會告訴你自己是什麼問題。而不是使用無意義的「代碼」變量,只給你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> 
+0

這可能是有幫助的。 我已經更新了我的代碼。 你能告訴我爲什麼代碼總是=「1」? 你可以看一下:http://jaouani.dyndns.pro/start/inscription – GrandGTO