19

ログイン/パスワードフォームを作成します:

モデル:

class LoginForm(forms.Form):
username = forms.CharField(max_length=100)
password = forms.CharField(widget=forms.PasswordInput(render_value=False),max_length=100)

見る:

def login_view(request):
    if request.method == 'POST':
        username = request.POST['email']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if user is not None and user.is_active:
            login(request, user)
            return HttpResponseRedirect("/n1.html")# Redirect to a success page.
        return HttpResponseRedirect("/login")
    form=LoginForm()
    return render(request, 'enter.html', {'login_form': LoginForm})

URL:

(r'^login/$', login_view),

レンプレート:

{% if form.errors %}
<p>Something is wrong</p>
{% endif %}

<form class="form-signin" action="" method="post">
    <h2 class="form-signin-heading">Login</h2>
    {% csrf_token %}

    <input class="input-block-level" type="text" name="email" value="" id="email" placeholder="Email">

    <input class="input-block-level" type="password" name="password" value="" id="username" placeholder="Password">

    <button class="btn btn-large btn-primary" type="submit">Login</button>
    <input type="hidden" name="next" value="{{next|escape}}" />

</form>

ログインページへのリダイレクトを使用し、ログインまたはパスワードが間違っていますが、この場合はエラーメッセージを表示したいと思います。なぜ構築{%if form.errors%}が機能しないのですか?どうも!

4

2 に答える 2

60

フォームはエラーが発生したことを認識していないためです。

ここでフォームを作成すると、次のようになります。

form=LoginForm()

情報を渡さずに構築しています。ユーザーが実行したばかりの POST について、またはログインが失敗したこと、パスワードが見つからなかったこと、またはエラーが何であったかについては何も知りません。

私のログインフォームは次のようになります。

class LoginForm(forms.Form):
    username = forms.CharField(max_length=255, required=True)
    password = forms.CharField(widget=forms.PasswordInput, required=True)

    def clean(self):
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')
        user = authenticate(username=username, password=password)
        if not user or not user.is_active:
            raise forms.ValidationError("Sorry, that login was invalid. Please try again.")
        return self.cleaned_data

    def login(self, request):
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')
        user = authenticate(username=username, password=password)
        return user

フォームのcleanメソッドをオーバーライドして、フォームが検証に合格した場合にユーザーの資格情報を確認できるようにします。また、ビューをきれいにするために、フォーム オブジェクト自体にログイン メソッドを配置します。

次に、私たちの見解では、これを行いたいと考えています。

def login_view(request):
    form = LoginForm(request.POST or None)
    if request.POST and form.is_valid():
        user = form.login(request)
        if user:
            login(request, user)
            return HttpResponseRedirect("/n1.html")# Redirect to a success page.
    return render(request, 'enter.html', {'login_form': form })

フォームをインスタンス化し、チェックする request.POST を渡します。

POST がある場合は、フォームが有効かどうかを確認します。フォームの「クリーン」メソッドが呼び出され、ユーザー資格情報がチェックされます。

資格情報が失敗した場合は、テンプレートに表示する必要があるエラーが発生します。

フォームによって発生したエラー (フィールドに関連付けられていない) は、次のように表示できる non_field_errors に格納されます。

{% if form.non_field_errors %}
    <ul class='form-errors'>
        {% for error in form.non_field_errors %}
            <li>{{ error }}</li>
        {% endfor %}
    </ul>
{% endif %}
于 2013-02-26T08:48:55.343 に答える
1

リダイレクトするとき、ページのコンテキストを送信するかどうかはわかりません。したがって、/login/ ページにリダイレクトすると、django はそれが読み込まれた新しいフォームであると認識します。

于 2013-02-26T08:43:55.820 に答える