2016-08-11 13 views
1

私はDjango 1.9.8を使用していますが、フォーム検証の使い方を学びたいと思っています。私はユーザーを登録するためのフォームに取り組んでいます。私は2つの問題を抱えています。POSTデータにDjangoフォームの入力がありません

  1. パスワードを再入力するフィールドには、forms.pyファイルメソッドではアクセスできません(まったくアクセスできません)。コンテンツを表示するのにraise Exception(self.cleaned_data.get('password'))を使用すると、パスワードが表示されます。私はまた、ユーザー名と電子メールを表示することができます。私はrepasswordフィールドに対して同じことを行うときは、None編集を示して - これは、検証エラーが私のフォーム上では、すべての表示されないクリーン()メソッド

  2. を使用するようにforms.pyファイルを変更することで解決しました。エラーがある場合、フォームへのリダイレクトは機能していますが、ユーザーが修正するための入力には何もなく、エラーも表示されません。 編集 - ここform = RegisterForm(request.POST)

にelse文の後RegisterFormコールを変更することで解決はここにフォームテンプレート

#register.html 

{% if form.errors %} 
    <h2>ERROR!</h2> 
    {% for field in form %} 
     {% for error in field.errors %} 
      <div class="alert alert-error"> 
       <strong>{{ error|escape }}</strong> 
      </div> 
     {% endfor %} 
    {% endfor %} 
{% endif %} 

<form method="post" action="" id="RegisterForm"> 
{% csrf_token %} 
    <p class="bs-component"> 
     <table> 
      <tr> 
       <td>{{ form.username.label_tag }}</td> 
       <td>{{ form.username }}</td> 
      </tr> 
      <tr> 
       <td>{{ form.email.label_tag }}</td> 
       <td>{{ form.email }}</td> 
      </tr> 
      <tr> 
       <td>{{ form.password.label_tag }}</td> 
       <td>{{ form.password }}</td> 
      </tr> 
      <tr> 
       <td>{{ form.repassword.label_tag }}</td> 
       <td>{{ form.repassword }}</td> 
      </tr> 
     </table> 
    </p> 
    <p class="bs-component"> 
     <center> 
      <input class="btn btn-success btn-sm" type="submit" value="Register" /> 
     </center> 
    </p> 
    <input type="hidden" name="next" value="{{ next }}" /> 
</form> 

forms.pyファイルここ

#forms.py 
class RegisterForm(forms.Form): 
    username = forms.CharField(label="Username", max_length=30, 
           widget=forms.TextInput(attrs={'class': 'form-control', 'name': 'username'})) 
    email = forms.CharField(label="Email", max_length=30, 
           widget=forms.TextInput(attrs={'class': 'form-control', 'name': 'email'})) 
    password = forms.CharField(label="Password", max_length=30, 
           widget=forms.TextInput(attrs={'class': 'form-control', 'name': 'password', 'type' : 'password'})) 
    repassword = forms.CharField(label="RePassword", max_length=30, 
           widget=forms.TextInput(attrs={'class': 'form-control', 'name': 'repassword', 'type' : 'password'})) 

    #Edit - this was changed to the clean() function in the selected answer. 
    def clean_password(self): 
     password1 = self.cleaned_data.get('password') 
     password2 = self.cleaned_data.get('repassword') 
     #raise Exception(self.cleaned_data.get('repassword')) # None is displayed 

     if password1 and password1 != password2: 
      raise forms.ValidationError("Passwords don't match") 
     return self.cleaned_data 

だあります表示

#views.py 
class RegisterViewSet(viewsets.ViewSet): 

    #GET requests 
    def register(self,request): 
     return render(request, 'authorization/register.html', {'form': RegisterForm}) 

    #POST requests 
    def create(self,request): 
     form = RegisterForm(request.POST) 
     if form.is_valid(): 
      username = request.POST['username'] 
      email = request.POST['email'] 
      password = request.POST['password'] 
      user = User.objects.create_user(username,email,password) 
      user.save() 
      return HttpResponseRedirect('/users') 
     else: 
      return render(request, 'authorization/register.html', {'form': RegisterForm }) 
      #changed the previous line to the following. This fixed the errors not displaying 
      #return render(request, 'authorization/register.html', {'form': RegisterForm(request.POST) }) 

答えて

2

なぜself.cleaned_data.get('repassword')がその方法でNoneを返すのかはわかりませんが、clean_passwordは、お互いに依存するフィールドの検証を実行する適切な場所ではありません。

docsによると、あなたはclean()機能での検証のようなものを実行する必要があります。

views.py

def register(self,request): 
    form = RegisterForm() # Notice `()` at the end 
    return render(request, 'authorization/register.html', {'form': form}) 

forms.py

... 

def clean(self): 
    cleaned_data = super(RegisterForm, self).clean() 

    password1 = cleaned_data.get('password') 
    password2 = cleaned_data.get('repassword') 

    if password1 and password1 != password2: 
     raise forms.ValidationError("Passwords don't match") 

ことに注意してくださいを実装する必要はありません3210およびclean_repassword

(あなたはまだclean_passwordを実装する必要があると思うなら、あなたはそれからpassword1を返す必要が、ないself.cleaned_data。)

またdocsで説明したように正確に形状誤差をレンダリングする必要があります。

があなたのテンプレートでそれを追加することを忘れないでください:2番目のエラーについては

{{ form.non_field_errors }} 

を、問題は、検証が新しい新鮮RegisterFormインスタンスの代わりに、無効化されたものを返して失敗するたびです。

あなたはcreate()機能で行を変更する必要があります。これに

return render(request, 'authorization/register.html', {'form': RegisterForm}) 

を:

return render(request, 'authorization/register.html', {'form': form}) 
+0

repasswordフィールドがforms.pyファイルにアクセスできるようになりましたし、正しく検証しますが、フォームがまだありますリダイレクト時に空白が表示され、エラーは表示されません。その他の提案はありますか? – user1852176

+0

'else'節で関連する行を' return render(request、 'authorization/register.html'、{'form':form}) 'に変更しましたか?また、[docs](https://docs.djangoproject.com/en/1.10/topics/forms/#rendering-fields-manually)の説明どおりにテンプレートを更新する必要があります。 – ozgur

+0

はい、コピーして100%スペルミスがないことを確認しました。 – user1852176

関連する問題