0

私はこのすべての検証がどのように機能するかを理解しようとしていますが、コツをつかんでいません。djangoprojectのほんの少しの例を読みましたが、概念とすべてがどのように結び付けられているかが欠けています。

私のコードを見て、物事がどうあるべきか、そしていくつかの説明を再配置していただければ、それは素晴らしいことです!

だから私は非常に簡単なことをしたいのです。メールのみでログインしてください。ユーザーがメールアドレスを入力したら、データベースにあるかどうかを確認し、ある場合はログインします。そうでない場合は、「ユーザーはすでにデータベースにあります」というエラーを発生させ、この人が/registerにアクセスすることを提案します。

だから私が現在持っているのは:

view.py:

def emailLogin(request, backend, extra_context=None, initial={}):

form = EmailLoginForm(initial=initial)
if request.method == 'POST':
    form = EmailLoginForm(initial=initial, data=request.POST)
    if form.is_valid():
        user = form.do_save()

        _no_pass_login(request, user) # my custom login
        return redirect('/')

    else:
        print ('not valid')

return render_jinja(request, 'registration/email_login_form.html',
        type="register",
        form = form
        )

forms.py

class EmailLoginForm(forms.Form):
    email = forms.EmailField()
    def do_save(self):
    try:
            u = User.objects.get(email=self.cleaned_data['email'])
        except :
            raise forms.ValidationError("Already in DB")

        return u

つまり、要点は、概念が欠落しているということです。検証エラーはどこで発生する必要がありますか、ビューまたはフォームですか?どこに上げられますか?誰がそれをキャッチしますか?各ファイルに何をインポートする必要があるかなど。

これはそれほど難しいことではないはずですが、私は今完全に迷子になっています。コードを分析して機能するように変更できる例がないので、ここにいます。

4

2 に答える 2

1

はい、あなたはいくつかの概念を見逃しているようです。

このタイプのフォームには、保存がまったくないはずです。そして、is_valid()チェックの要点は検証エラーをキャッチすることです-したがって、それらはその呼び出しによって発生する必要があります。cleanそのための方法は、フォームにメソッドを定義することです。この場合、emailフィールドをチェックするだけなので、clean_emailメソッドを定義します。コードは、現在取得しているものと同じである必要がありますdo_save

ここで、is_valid()Falseを返します。ただし、実際にエラーを表示するには、ビューにいくつかの調整が必要です。まず、そのelseブロックを1つのインデントレベルに戻しif request.method == 'POST'、に一致するようにします。printここで、そのステートメントの代わりに、最初の行form = EmailLoginForm(initial=initial)をそこに移動します。これで、is_valid()がFalseの場合、ビューは、検証エラーを含むすでにインスタンス化されたフォームを使用して、render_to_responseに直接到達します。魔法!

于 2011-05-09T16:23:58.073 に答える
1

これはダニエルが話していたことだと思いますが、何が起こっているのか正確にわからないと混乱する可能性があります。基本的に、フォームが行うのはデータを検証することだけです。すべての保存はビューで行われます。

view.py

def emailLogin(request, backend, extra_context=None, initial={}):

    form = EmailLoginForm
    if request.method == 'POST':
        form = form(initial=initial, data=request.POST)
        if form.is_valid():
            _no_pass_login(request, user) # my custom login
            return redirect('/')
        else:
            print 'Form not valid'

    else:
        form = form(initial=initial)

return render_jinja(request, 'registration/email_login_form.html',
    type="register",
    form = form
    )

forms.py

class EmailLoginForm(forms.Form):

    email = forms.EmailField()

    def clean_email(self, *args, **kwargs):
        email = self.cleaned_data['email']
        if User.objects.filter(email=email).count() > 0:
            raise ValidationError('User with email "%s" already exists' % email)
        return email
于 2011-05-09T16:41:04.180 に答える