2013-10-20 2 views
1

맞춤 로그인 양식을 만들려고합니다. 아래는 제가 지금까지 가지고있는 것입니다. 내 문제는 내가 무엇을해도 로그인이 결코 인증되지 않는다는 것입니다. tho에도 정확한 이메일과 비밀번호가 있습니다. 항상Django 사용자 정의 로그인은 왜 인증되지 않습니까?

올바른 사용자 이름과 비밀번호를 입력하십시오. 두 필드는 대소 문자를 구분 할 수 있습니다.

이메일과 비밀번호를 확인하기 때문에 문제라고 생각합니다.

* 이것은 내 양식입니다. *

class EmailAuthenticationForm(AuthenticationForm): 
    username = forms.EmailField(label=_('Email Address')) 
    redirect_url = forms.CharField(
     widget=forms.HiddenInput, required=False) 

    def __init__(self, host=None, *args, **kwargs): 
     self.host = host 
     super(EmailAuthenticationForm, self).__init__(*args, **kwargs) 

이 내보기입니다. **

class AccountAuthView(FormView): 
    template_name = 'accounts/login.html' 
    form_class = EmailAuthenticationForm 
    redirect_field_name = 'next' 

    def get_form_class(self): 
     return self.form_class 

    def form_valid(self, form): 
     auth_login(self.request, form.get_user()) 
     return HttpResponseRedirect(form.cleaned_data['redirect_url']) 

    def get(self, request, *args, **kwargs): 
     if request.user.is_authenticated(): 
      return HttpResponseRedirect(settings.LOGIN_REDIRECT_URL) 
     return super(AccountAuthView, self).get(
      request, *args, **kwargs) 
+0

정말로 신임 정보가 정확합니까? 첫 걸음에서 사용자를 어떻게 만들었습니까? –

+3

@ Daniel Roseman 그렇습니다. 내 양식이 AuthenticationForm을 확장하기 때문에 이메일과 비밀번호가 아닌 사용자 이름과 비밀번호를 확인하는 것이기 때문에 생각하십니까? – GrantU

+0

사용자 모델을 사용자 정의해야하는 것처럼 보입니다. 기본적으로 사용자 이름과 비밀번호를 인증하려고 시도 할 것입니다. 이메일 주소가 아닙니다. – aychedee

답변

2

예이 먼저 인증 백엔드 만드는 아주 쉽게 수행 할 수 있습니다

AUTHENTICATION_BACKENDS = ('backends.EmailAuthBackend',) 

마지막 메이크업 : settings.py에

from django.contrib.auth import get_user_model 


class EmailAuthBackend(object): 
    """ 
    Email Authentication Backend 
    """ 

    def authenticate(self, username=None, password=None): 
     """ Authenticate a user based on email address as the user name. """ 
     try: 
      user = get_user_model().objects.get(email=username) 
      if user.check_password(password): 
       return user 
     except get_user_model().DoesNotExist: 
      return None 

그런

backend.py을 양식에 이메일 입력란이 있는지 확인하십시오 :

<form action="." method="post"> 
    {% csrf_token %} 
    <input type="hidden" name="next" value="{{ next }}" /> 
    {{ form.non_field_errors }} 
    {% for field in form %} 
    <div class="field-wrapper"> 
     <div class="label-wrapper"> 
     {% if field.name == "username" %} 
      Email address 
     {% else %} 
      {{ field.label_tag }} 
     {% endif %} 
     {% if field.field.required %}<span class="required">*</span>{% endif %} 
     </div> 
     <div class="value-wrapper"> 
     {{ field }} 
     {{ field.errors }} 
     </div> 
    </div> 
    {% endfor %} 
    <div class="submit-wrapper"> 
    <input type="submit" value="Sign In" /> 
    </div> 
</form> 
+1

PS. 위 예제에서와 같이 get_user_model을 사용한다면 AUTH_USER_MODEL도 잊지 마십시오. –

1

장고 사용자 인증을 수행하는 방법을 보여주기 위해 Full Example 있습니다.

관련 문제