اذهب إلى المحتوى

السؤال

نشر

ما هي أفضل طريقة لتوسيع نموذج المستخدم (مع تطبيق مصادقة  Django's authentication app) بحقول مخصصة (أي إضافة حقول جديدة)؟ أرغب أيضًا في استخدام البريد الإلكتروني كإسم مستخدم على سبيل المثال، فكيف أقوم بذلك؟ هل يجب أن أقوم بعمل جدول جديد مع علاقة one to one؟ أم أن هناك طريقة أخرى؟

 

Recommended Posts

  • 1
نشر

إليك المثال التالي من التوثيق الرسمي:

from django.db import models
from django.contrib.auth.models import (
    BaseUserManager, AbstractBaseUser
)
class MyUserManager(BaseUserManager):
    def create_user(self, email, date_of_birth, password=None):
	# ينشئ ويحفظ مستخدمًا بالبريد الإلكتروني المحدد وتاريخ الميلاد وكلمة المرور
        if not email:
            raise ValueError('Users must have an email address')
        user = self.model(
            email=MyUserManager.normalize_email(email),
            date_of_birth=date_of_birth,
        )
        user.set_password(password)
        user.save(using=self._db)
        return user
    def create_superuser(self, username, date_of_birth, password):
		#مع البريد الإلكتروني المحدد وتاريخ الميلاد وكلمة المرور  superuser يقوم بحفظ وإنشاء 
        u = self.create_user(username,
                        password=password,
                        date_of_birth=date_of_birth
                    )
        u.is_admin = True
        u.save(using=self._db)
        return u
class MyUser(AbstractBaseUser):
    email = models.EmailField(
                        verbose_name='email address',
                        max_length=255,
                        unique=True,
                    )
    date_of_birth = models.DateField()
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    objects = MyUserManager()
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['date_of_birth']
    def get_full_name(self):
        # يتم التعرف على المستخدم من خلال عنوان بريده الإلكتروني
        return self.email
    def get_short_name(self):
        # يتم التعرف على المستخدم من خلال عنوان بريده الإلكتروني
        return self.email
    def __unicode__(self):
        return self.email
    def has_perm(self, perm, obj=None):
        "هل المستخدم لديه سماحية محددة؟"
        # أبسط إجابة ممكنة: نعم ، دائمًا
        return True
    def has_module_perms(self, app_label):
        "هل يمتلك المستخدم أذونات لعرض التطبيق" app_label "؟"
        # أبسط إجابة ممكنة: نعم ، دائمًا
        return True
    @property
    def is_staff(self):
        "هل المستخدم عضو في فريق العمل؟"
        # أبسط إجابة ممكنة: جميع المسؤولين هم موظفين
        return self.is_admin

كل ما عليك فعله هو إضافة AUTH_USER_MODEL إلى الإعدادات مع المسار إلى كلاس ال custom user ، والتي تتوسع إما AbstractBaseUser (إصدار أكثر قابلية للتخصيص) أو AbstractUser (يمكنك توسيع فئة المستخدم القديمة بشكل أكبر أو أقل).

  • 0
نشر

أنشئ ملف manager.py في مجلد users

from django.contrib.auth.base_user import BaseUserManager
from django.utils.translation import ugettext_lazy as _


class CustomUserManager(BaseUserManager):
    """
    موديل معدل لجعل الدخول ب ايميل بدل اسم المستخدم
    """
    def create_user(self, email, password, **extra_fields):
        """
       انشاء المستخدم
        """
        if not email:
            raise ValueError(_('The Email must be set'))
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, email, password, **extra_fields):
        """
        انشاء المستخدم ادمن 
        """
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('is_active', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError(_('Superuser must have is_staff=True.'))
        if extra_fields.get('is_superuser') is not True:
            raise ValueError(_('Superuser must have is_superuser=True.'))
        return self.create_user(email, password, **extra_fields)

من هنا يمكنك الاختيار اما استخدام AbstractUser أو AbstractBaseUser والشيفرة المستخدم في model.py على التوالي

AbstractUser

from django.contrib.auth.models import AbstractUser
from django.db import models
from django.utils.translation import ugettext_lazy as _

from .managers import CustomUserManager


class CustomUser(AbstractUser):
    username = None
    email = models.EmailField(_('email address'), unique=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = CustomUserManager()

    def __str__(self):
        return self.email

AbstractBaseUser

from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _

from .managers import CustomUserManager


class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(_('email address'), unique=True)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    date_joined = models.DateTimeField(default=timezone.now)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = CustomUserManager()

    def __str__(self):
        return self.email

تبقى الان أن تعدل settings.py

AUTH_USER_MODEL = 'users.CustomUser'

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...