2

カスタム バックエンド (サブクラス化された django-registration の SimpleBackend) を使用しています。register()登録中に何らかの処理を行う必要があるため (たとえば、外部サービスとの通信) 、メソッドをオーバーライドします。

登録に失敗した場合、登録フォームにエラーが発生したことを伝えることはできますか?

これはフォーム検証レベルで実装する必要がありますか?

別の例として、ユーザーの作成時にデータベース エラーが発生する可能性があります。登録が正常に失敗するにはどうすればよいですか?

編集:これがSimpleBackendの私のサブクラスです:

class MySimpleBackend(SimpleBackend):
    def register(self, request, **kwargs):
        username, email, password = kwargs['username'], kwargs['email'], kwargs['password1']

        # 
        # Make a call to some external API, for example
        retval = api_call_to_somewhere()
        if retval is False:
            # Request failed: display some error message on registration form
            return something
            # OR
            raise some_other

        # Rest of code is the same as django-registration

        User.objects.create_user(username, email, password)

        # authenticate() always has to be called before login(), and
        # will return the user we just created.
        new_user = authenticate(username=username, password=password)
        login(request, new_user)
        signals.user_registered.send(sender=self.__class__,
                                     user=new_user,
                                     request=request)
        return new_user
4

2 に答える 2

0

(メソッドと混同しないでください)から、 django-registrationのregisterビューをカスタマイズすることになりましたregistration.viewsSimpleBackend.register

元のビューはbackend.register()ifform.is_valid()を呼び出してから成功 URL にリダイレクトするため、ユーザーが で作成されたと想定し、backend.register()例外をキャッチしません。例外をキャッチする独自のコードを追加すると、エラーを発生さbackend.register()せ、フォーム エラーとしてユーザーに表示できます。

以下は、関数django-registration\registration\viewsの途中に表示されるコードで、追加した行があります。register

if request.method == 'POST':
    form = form_class(data=request.POST, files=request.FILES)
    if form.is_valid():
        try:  # added this line
            new_user = backend.register(request, **form.cleaned_data)
            if success_url is None:
                to, args, kwargs = backend.post_registration_redirect(request, new_user)
                return redirect(to, *args, **kwargs)
            else:
                return redirect(success_url)
        # added these 3 lines below
        except Exception, err:
            errors = form._errors.setdefault(NON_FIELD_ERRORS, ErrorList())
            errors.append(err)
于 2012-12-26T16:50:32.253 に答える