0

目前,我有不同的注册和登录视图,它们都实现为基于类的视图,并用于不同的 url。两者都使用相同的表单,该表单具有两个字段emailpassword. 这两种观点有form_valid不同的逻辑,因此也有不同的逻辑。所以,注册视图创建一个用户,发送验证邮件等。登录视图只登录用户。

用例已更改为允许使用单个表单在同一个 url 上注册和登录。

我想拥有相同的观点,同时处理这两种情况。因此,当提交表单时,我将使用提交的电子邮件检查数据库中是否存在用户。如果是,则使用 LoginView 逻辑。如果没有,则使用 SignupView 逻辑。如何通过重用 SignupView 和 LoginView 在单个视图中处理这两个条件。

4

1 回答 1

0

在您的情况下,您可以使用一个表单和一个视图。此表单检查电子邮件是否存在,如果存在,则引发 ValidationsError

class LoginOrSignupForm(forms.ModelForm):
    email = forms.EmailField()
    password = forms.CharField(widget=forms.PasswordInput(render_value=False))

    def clean_email(self):
        existing = User.objects.filter(email__iexact=self.cleaned_data['email'], username__iexact=self.cleaned_data['email'])
        if existing.exists():
            raise forms.ValidationError(_("A user with this e-mail already exists."))
        return self.cleaned_data['email']

然后在你看来

if form.is_valid():
    #signup
elif form['email'].errors and form['email'].errors[0] == _("A user with this e-mail already exists."):
    #login
    user = auth.authenticate(username=form['email'].value(), password=form['password'].value())
    auth.login(request, user)

该解决方案在基于功能的视图中工作。因此,对于您想要使用 CBV 的情况,我们可以在您的 CBV 中覆盖 form_invalid 方法:

def form_invalid(self, form):
    if form['email'].errors and form['email'].errors[0] == _("A user with this e-mail already exists."):
        user = auth.authenticate(username=form['email'].value(), password=form['password'].value())
        auth.login(request, user)
        return HttpRedirect('your page')
    return super(YouViewName, self).form_invalid(form)

对于 form_valid 我们不需要覆盖它,只要记住如果你的表单是有效的,它应该注册一个新用户。在这种情况下,adjango.views.generic.CreateView可以提供帮助。

于 2013-07-01T11:17:54.263 回答