私はDjango 1.9.8を使用していますが、フォーム検証の使い方を学びたいと思っています。私はユーザーを登録するためのフォームに取り組んでいます。私は2つの問題を抱えています。POSTデータにDjangoフォームの入力がありません
パスワードを再入力するフィールドには、forms.pyファイルメソッドではアクセスできません(まったくアクセスできません)。コンテンツを表示するのに
raise Exception(self.cleaned_data.get('password'))
を使用すると、パスワードが表示されます。私はまた、ユーザー名と電子メールを表示することができます。私はrepasswordフィールドに対して同じことを行うときは、None
編集を示して - これは、検証エラーが私のフォーム上では、すべての表示されないクリーン()メソッドを使用するように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) })
repasswordフィールドがforms.pyファイルにアクセスできるようになりましたし、正しく検証しますが、フォームがまだありますリダイレクト時に空白が表示され、エラーは表示されません。その他の提案はありますか? – user1852176
'else'節で関連する行を' return render(request、 'authorization/register.html'、{'form':form}) 'に変更しましたか?また、[docs](https://docs.djangoproject.com/en/1.10/topics/forms/#rendering-fields-manually)の説明どおりにテンプレートを更新する必要があります。 – ozgur
はい、コピーして100%スペルミスがないことを確認しました。 – user1852176