あなたの場合、1 つのフォームと 1 つのビューを使用できます。このフォームは、電子メールが存在するかどうかを確認し、存在する場合は 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
が役立ちます。