6

Tôi đang sử dụng đăng nhập tích hợp trong ứng dụng của mình. Có một số chương trình phụ trợ hoặc gói tùy chỉnh để xử lý việc này. nhưng nhiều người trong số họ không phải là những gì tôi đang tìm kiếm.Django- cách sử dụng chế độ xem đăng nhập được tích hợp với email thay vì tên người dùng?

tôi đã tạo email duy nhất qua đăng ký django khi đăng ký. bây giờ tất cả những gì tôi muốn là hỏi email trong trang đăng nhập thay vì tên người dùng.

nhưng nếu tôi sử dụng một số chương trình phụ trợ tùy chỉnh như django email as username, sự cố sẽ xảy ra khi sử dụng với đăng ký django.

tôi không muốn thay đổi tất cả phụ trợ xác thực, tôi chỉ muốn thay đổi trang đăng nhập.

trong phần còn lại của trang web, tôi sẽ sử dụng tên người dùng. p.e trong trang quản trị tùy chỉnh của tôi khi tôi viết:

welcome {{user}} 

nó phải hiển thị tên người dùng. không phải e-mail.

tôi cần tìm cách thoát khỏi điều này. tôi bị mắc kẹt.

cảm ơn bạn.

Trả lời

9

Theo mặc định django.contrib.auth.urls sẽ tạo ra một trang đăng nhập từ mô hình này

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

Bạn cần tránh/ghi đè url này sau đó tạo ra một cái nhìn mới để xử lý một loại mới của đăng nhập.

ví dụ:

tạo ra một url đăng nhập mới trong urls.py bạn

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

tạo nhằm hỗ trợ đăng nhập với email trong 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. 

Ref: https://docs.djangoproject.com/en/1.4/topics/auth/#django.contrib.auth.login

+0

cảm ơn bạn, nó đã hoạt động :) – alix

2

Phương pháp trên không không hoạt động nữa trên django 1.9. Một cách tiếp cận khác nhau có thể ghi đè lên các hình thức auth sử dụng trong giao diện như sau:

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() 

Sau đó, khi xác định địa chỉ đăng nhập, xác định như thế này:

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

Điều tốt nhất về cách tiếp cận trên bạn không thực sự chạm vào bất cứ thứ gì trong quá trình xác thực. Nó không thực sự là một giải pháp "sạch" nhưng nó là một giải pháp nhanh chóng. Khi bạn xác định đường dẫn đăng nhập trước khi bao gồm auth.urls, nó sẽ được đánh giá thay vì biểu mẫu đăng nhập cơ sở

Các vấn đề liên quan