• 1

إضافة لنموذج المستخدم حقول مخصصة في جانغو Django؟

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

 

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 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 (يمكنك توسيع فئة المستخدم القديمة بشكل أكبر أو أقل).

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 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'

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن