0

同じテンプレートでログイン ビューとサインアップ ビューが必要です。このテンプレートのように:

<h1>Login</h1>
<form method="post" action="">
    {{ form.as_p }}
    <input type="submit" />
</form>

<h1>Sign up</h1>
<form method="post" action="">
    {{ form.as_p }}
    <input type="submit" />
</form>

私のログインは次のようになります

class Login(FormView):
    form_class = AuthenticationForm
    template_name = 'user/login.html'

    def form_valid(self, form):
        login(self.request, form.get_user())
        return super(Login, self).form_valid(form)

私のサインアップビューはフォームクラスを使用していますUserCreationForm。異なるフォーム クラスを持つ 1 つのビューを持つことはどのように可能ですか? また、ユーザーがログインしようとしたかサインアップしようとしたかをビューが判断できるようにするには、2 つのフォーム アクションはどのようにすべきでしょうか?

4

2 に答える 2

2

汎用ビューで複数のフォームを持つことができるとは思わないでください。

  • ただし、両方の操作で単一のフォームを保持できます。
  • ユーザーの操作に応じて、フィールドを非表示または再表示します。
  • フォーム送信によるサインアップ/ログイン操作を識別するために、2 つの送信ボタンを用意します。
  • ユーザーが押した送信ボタンに応じて、ビューで適切なアクションを実行します。
于 2013-05-24T04:41:07.247 に答える
0

このソリューションのように、MultipleFormView クラスを作成する方が良いと思いますhttps://gist.github.com/michelts/1029336

UPD:
申し訳ありませんが、すべてのフォームを検証するため、良い解決策ではありません。これは TemplateView に基づくソリューションです

class LoginSignupView(TemplateView):
    template_name = 'login_signup.html'
    redirect_field_name = 'next'
    login_prefix = 'login'
    signup_prefix = 'signup'

    def check_redirect(self, context):
        redirect_to = context.get(self.redirect_field_name)
        if not redirect_to:
            return settings.LOGIN_REDIRECT_URL

        netloc = urlparse.urlparse(redirect_to)[1]
        if netloc and netloc != self.request.get_host():
            return settings.LOGIN_REDIRECT_URL

        return redirect_to

    def get_context_data(self, *args, **kwargs):
        context = super(LoginSignupView, self).get_context_data(*args, **kwargs)
        redirect_to = self.request.REQUEST.get(self.redirect_field_name, '')
        context[self.redirect_field_name] = redirect_to
        context['login_form'] = AuthenticationForm(prefix=self.login_prefix)
        context['signup_form'] = UserCreationForm(prefix=self.signup_prefix)
        return context

    def post(self, request, *args, **kwargs):
        context = self.get_context_data(*args, **kwargs)
        redirect_to = self.check_redirect(context)

        if u'login_submit' in self.request.POST:
            login_form = AuthenticationForm(
                prefix=self.login_prefix,
                data=request.POST
            )
            if login_form.is_valid():
                auth_login(request, login_form.get_user())
                if request.session.test_cookie_worked():
                    request.session.delete_test_cookie()
                return HttpResponseRedirect(redirect_to)
            context['login_form'] = login_form

        if u'signup_submit' in self.request.POST:
            signup_form = UserCreationForm(
                prefix=self.signup_prefix,
                data=request.POST
            )

            if signup_form.is_valid():
                # register user
                return HttpResponseRedirect(redirect_to)
            context['signup_form'] = signup_form

        self.request.session.set_test_cookie()
        return self.render_to_response(context)
于 2013-05-24T08:06:26.560 に答える