2013-07-01 2 views
0

현재 다른 가입 및 로그인보기가 모두 클래스 기반보기로 구현되어 있으며 다른 URL에서 사용됩니다. 둘 다 emailpassword 두 개의 필드가있는 동일한 양식을 사용합니다. 이 두보기에는 다른 form_valid 및 다른 논리가 있습니다. 따라서 가입보기는 사용자를 만들고 확인 메일을 보냅니다. 로그인보기는 사용자 만 로그인합니다.단일 클래스 기반보기로 로그인하고 가입하려면 어떻게해야합니까?

단일 양식을 사용하여 동일한 URL에서 가입 및 로그인 할 수 있도록 유스 케이스가 변경되었습니다.

동일한보기를 원하고 두 가지 조건을 모두 처리하고 싶습니다. 따라서 양식을 제출할 때 제출 된 이메일이있는 DB에 사용자가 있는지 확인합니다. 그렇다면 LoginView 로직을 사용하십시오. 그렇지 않다면 SignupView 로직을 사용하십시오. SignupView 및 LoginView를 다시 사용하여이 두 조건을 한 번에 처리 할 수있는 방법은 무엇입니까?

+0

보기에서 비즈니스 로직을 메소드로 추출하고 결합 된보기에서 해당 메소드를 호출하십시오. –

답변

0

하나의 양식과 하나의보기를 사용할 수 있습니다. 이메일이 존재하는 경우가 존재하는 경우 이 양식 검사,보기

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) 

의 기능을 기반으로보기에이 솔루션 작업을 다음

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'] 

그리고 ValidationsError

을 올립니다. 그래서 경우에 당신은 우리가 당신의 CBV에 form_invalid 방법을 대체 할 수 있습니다, CBV를 사용하려면 :

우리가 명심를 오버라이드 (override) 할 필요가 없습니다 form_valid를 들어
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) 

양식이 유효한 경우 그, 새로운 사용자를 등록해야합니다. 이 경우 django.views.generic.CreateView이 도움이 될 수 있습니다.