6

내 응용 프로그램에서 내장 로그인을 사용하고 있습니다. 이를 처리 할 사용자 정의 백엔드 또는 패키지가 있습니다. 그러나 그들 중 많은 사람들이 내가 바라는 것이 아닙니다.Django- 사용자 이름 대신 전자 메일과 함께 기본 제공 로그인보기를 사용하는 방법?

나는 등록하는 동안 장고 등록을 통해 고유 한 이메일을 만들었습니다. 이제 내가 원하는 것은 사용자 이름 대신 로그인 페이지에서 이메일을 요청하는 것뿐입니다.

그러나 내가 django email as username과 같은 사용자 정의 백엔드를 사용하면 장고 등록과 함께 사용할 때 충돌이 발생합니다.

나는 모든 인증 백엔드를 변경하고 싶지 않다. 단지 로그인 페이지를 변경하고 싶다.

나머지 사이트에서는 사용자 이름을 사용할 예정입니다. p.e 내 사용자 정의 관리 페이지에 쓸 때 :

welcome {{user}} 

사용자 이름을 렌더링해야합니다. 전자 메일이 아닙니다.

나는 이것에서 탈출구를 찾아야합니다. 나는 붙어있다.

감사합니다. 기본적 django.contrib.auth.urls으로

답변

9

(r'^login/$', 'django.contrib.auth.views.login'), 

당신은/피 한 후 로그인의 새로운 유형을 처리 할 수있는 새로운 뷰를 생성이 URL을 재정의해야이 패턴에서 페이지에 로그를 생성합니다.

당신의 urls.py에서 새 로그인 URL을 생성

(r'^emaillogin/$', 'email_login_view'), 

views.py

# get default authenticate backend 
from django.contrib.auth import authenticate, login 
from django.contrib.auth.models import User 

# create a function to resolve email to username 
def get_user(email): 
    try: 
     return User.objects.get(email=email.lower()) 
    except User.DoesNotExist: 
     return None 

# create a view that authenticate user with email 
def email_login_view(request): 
    email = request.POST['email'] 
    password = request.POST['password'] 
    username = get_user(email) 
    user = authenticate(username=username, password=password) 
    if user is not None: 
     if user.is_active: 
      login(request, user) 
      # Redirect to a success page. 
     else: 
      # Return a 'disabled account' error message 
    else: 
     # Return an 'invalid login' error message. 

참조 이메일에 로그인을 지원하기 위해 뷰를 만들 : https://docs.djangoproject.com/en/1.4/topics/auth/#django.contrib.auth.login

+0

이 평가됩니다. 감사합니다. :) – alix

2

위의 접근 방식은 않습니다 장고 1.9에서 더 이상 작동하지 않습니다. 이 같은 정의

class EmailLoginForm(AuthenticationForm): 
def clean(self): 
    try: 
     self.cleaned_data["username"] = get_user_model().objects.get(email=self.data["username"]) 
    except ObjectDoesNotExist: 
     self.cleaned_data["username"] = "a_username_that_do_not_exists_anywhere_in_the_site" 
    return super(EmailLoginForm, self).clean() 

그런 다음 로그인 URL을 정의 할 때 : 다른 접근 방식으로 뷰에 사용되는 인증 양식을 대체 할 수 있습니다

url(r'^login/$', django.contrib.auth.views.login, name="login", kwargs={"authentication_form": EmailLoginForm}), 
url(r'^', include('django.contrib.auth.urls')), 

당신이 위의 접근 방법의 가장 좋은 점 실제로 인증 프로세스에서 아무 것도 만지지 않습니다. 정말 "깨끗한"솔루션은 아니지만 빠른 해결 방법입니다. auth.urls를 포함하기 전에 로그인 경로를 정의하면 기본 로그인 양식 대신에