Django: تغيير/السماح لاسم المستخدم بتسجيل الدخول للمستخدم لاستخدام بريده الإلكتروني أيضًا

StackOverflow https://stackoverflow.com/questions/4267627

سؤال

كما يقول عنواني ، أريد أن أعرف ما إذا كانت هناك طريقة للسماح للمستخدم باستخدام ليس فقط اسم المستخدم الخاص به ، ولكن أيضًا على بريده الإلكتروني لتسجيل الدخول. أرغب في توحيد إجراء تسجيل الدخول لأنني في الوقت الحالي ، استخدم مستخدمي العديد من الاتفاقيات المختلفة ويصبح فوضويًا جدًا.

هل كانت مفيدة؟

المحلول

ربما يمكنك القيام بذلك إذا قمت بفرض عناوين بريد إلكتروني فريدة. بمعنى عدم وجود مستخدم يمكن أن يكون له نفس عنوان البريد الإلكتروني. وبهذه الطريقة ، يمكنك جلب المستخدم عن طريق عنوان البريد الإلكتروني وتسجيل الدخول.

قد يبدو النموذج شيئًا كهذا:

<form method="post" action="{% url myproject.views.login %}">
     <p>Username</p>
     <input type='text' name='username'/>

     <p>Password</p>
     <input type='password' name='password'/>
     <input type="submit" value="Login"/>
</form>

قد تبدو طريقة العرض شيئًا من هذا القبيل:

def login( request ):
    username = request.POST['username']
    password = request.POST['password']
    user = User.objects.filter( email = username )[0]
    if( user is not None ):
         # -- the user was retrieved by an email address
         # -- now you can authenticate and log them in log them in
         from django.contrib import auth
         user = auth.authenticate( user.username, password )
         if( user is not None ):
              auth.login( user, request )

قد يكون OpenID وسيلة أخرى للذهاب: http://bit.ly/a2olhx

تأكد من عناوين البريد الإلكتروني الفريدة لكل مستخدم: http://bit.ly/aoaabw

نصائح أخرى

أعتقد أنني "حلت" مشكلتي ، على الأقل أنها وظيفية ، في الوقت الحالي. قررت استخدام الواجهة الخلفية المصادقة الخاصة بي. لقد قمت بإنشاء ملف "Auth_backends.py" وأضفته إلى Authentication_BackEnds في الإعدادات الخاصة بي.

تحتوي حقول نموذج تسجيل الدخول الخاصة بي على "اسم المستخدم" وكلمة المرور فقط. الطريقة الوحيدة التي أقوم بها للتحقق مما إذا كان اسم المستخدم الذي تم إدخاله هو في الواقع اسم المستخدم أو البريد الإلكتروني ، هو القيام بـ .find ('@'). هل هناك طريقة أفضل للتحقق من ذلك؟ هل سيكون هذا كافيًا؟ السبب كله في القيام بذلك هو أنه من الأسهل على المستخدم أن يتذكر بريده الإلكتروني من اسم المستخدم الخاص به (وهو في الواقع "معرف" يتكون من أرقام).

سأضطر أيضًا إلى رعاية رسائل البريد الإلكتروني المكررة.

from django.conf import settings
from django.contrib.auth.backends import ModelBackend
from django.core.exceptions import ImproperlyConfigured
from django.db.models import get_model
from django.contrib.auth.models import User

class CustomUserModelBackend(ModelBackend):

def authenticate(self, **credentials):
    if 'username' in credentials:
        if credentials['username'].find('@') > 0:
            return self.authenticate_by_email(**credentials)
        else:
            return self.authenticate_by_username(**credentials)

def authenticate_by_username(self, username=None, password=None):
    try:
        user = User.objects.get(username=username)
        if user.check_password(password):
            return user
    except User.DoesNotExist:
        return None

def authenticate_by_email(self, username=None, password=None):
    try:
        user = User.objects.get(email=username)
        if user.check_password(password):
            return user
    except User.DoesNotExist:
        return None
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top