6

मैं अपने ऐप में अंतर्निहित लॉगिन का उपयोग कर रहा हूं। इसे संभालने के लिए कुछ कस्टम बैकएंड या पैकेज हैं। लेकिन उनमें से कई नहीं हैं जो मैं देख रहा हूं।Django- उपयोगकर्ता नाम के बजाय ईमेल के साथ अंतर्निहित लॉगिन दृश्य का उपयोग कैसे करें?

पंजीकरण करते समय मैंने डीजेंगो-पंजीकरण के माध्यम से ईमेल अद्वितीय बनाया। अब मैं चाहता हूं कि उपयोगकर्ता नाम के बजाय लॉगिन पेज में ईमेल पूछना है।

लेकिन अगर मैं django email as username जैसे कुछ कस्टम बैकएंड का उपयोग करता हूं तो यह django-पंजीकरण के साथ उपयोग करते समय क्रैश हो जाता है।

मैं सभी प्रमाणीकरण बैकएंड को बदलना नहीं चाहता, मैं सिर्फ लॉगिन पेज बदलना चाहता हूं।

शेष साइट पर, मैं उपयोगकर्ता नाम का उपयोग करने वाला हूं। जब मैं लिखता हूं तो मेरे कस्टम व्यवस्थापक पृष्ठ में 0:

welcome {{user}} 

इसे उपयोगकर्ता नाम प्रस्तुत करना होगा। ई-मेल नहीं

मुझे इससे बाहर निकलने की ज़रूरत है। मैं फँस गया हूँ।

धन्यवाद।

उत्तर

9

डिफ़ॉल्ट django.contrib.auth.urls तक इस पद्धति

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

आप से बचने/तो लॉगिन के एक नए प्रकार संभाल करने के लिए एक नया दृश्य बनाने के इस यूआरएल को ओवरराइड करने की आवश्यकता से पेज में एक लॉग पैदा करेगा।

उदा।

अपने urls.py में एक नया लॉगिन यूआरएल बनाने

(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

ऊपर दृष्टिकोण करता है django 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(r'^login/$', django.contrib.auth.views.login, name="login", kwargs={"authentication_form": EmailLoginForm}), 
url(r'^', include('django.contrib.auth.urls')), 

ऊपर दृष्टिकोण आप कर रहे हैं के बारे में सबसे अच्छी बात वास्तव में लेख प्रक्रिया में कुछ भी छूना नहीं। यह वास्तव में एक "साफ" समाधान नहीं है लेकिन यह एक त्वरित कामकाज है। जैसा कि आप auth.urls समेत लॉगिन पथ को परिभाषित करते हैं, इसका मूल्यांकन बेस लॉगिन फॉर्म

संबंधित मुद्दे

 संबंधित मुद्दे