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

السؤال

نشر

اريد صناعة عدة اصناف ترث من الصنف User حيث اضيف لكل صنف اشياء تخصه بحث استعملها لانشاء مستخدمين  

مثلا الصنف vendor  فيه خاصية

type = models.charField(max_length = 20 , default ='vendor')

و عدة خواص اخرى  , في نفس الوقت 
عند تسجيل بائع جديد , اريد استخدام هذا الصنف للتسجيل بدلا من User

و ايضا صنف customer له عدة خواص مختلفة عن ما يرث منه

مثلا

type = models.charField(max_length = 20 , default ='customer')

, يرث ايضا من user , و يستعمل لانشاء مستخدمين بدلا من User
 

حاولت فعل هذا لكنني تلقيت اخطاء كثيرة

class Vendor(AbstractUser):
    type = models.CharField( max_length=50,default = "vendor")
    def __init__(self, username="test1",password='pass_test',is_staff=False,*args: Any, **kwargs: Any) -> None:
        super().__init__(username,password,*args, **kwargs)


 

Recommended Posts

  • 1
نشر

يمكنك استخدام التوريث لإنشاء فئات فرعية من الصنف User بهذا الشكل:

from django.contrib.auth.models import AbstractUser
from django.db import models

class User(AbstractUser):
    # خيارات نوع المستخدم
    USER_TYPE_CHOICES = (
        ('vendor', 'Vendor'),
        ('customer', 'Customer'),
    )
    # حقل نوع المستخدم
    user_type = models.CharField(max_length=20, choices=USER_TYPE_CHOICES)

# فئة فرعية لبائع
class Vendor(User):
    # خاصية خاصة بالبائع
    vendor_specific_property = models.CharField(max_length=100)

# فئة فرعية للعميل
class Customer(User):
    # خاصية خاصة بالعميل
    customer_specific_property = models.CharField(max_length=100)

حيث بداية تقوم بتعريف فئة User التي تمثل المستخدم الأساسي وتحتوي على خيارات نوع المستخدم وحقل لتحديد نوع المستخدم. ثم ننشئ فئات فرعية (Vendor وCustomer) ترث من الفئة الأساسية User ونضيف الخصائص الخاصة لكل فئة. هذا الحل يسمح لنا بإنشاء مستخدمين من نوعين مختلفين (بائع وعميل) وتخصيص الخصائص الخاصة بهم بسهولة.

  • 1
نشر

في البداية عليك تعريف صنف User الأساسي، حيث نستخدم AbstractUser من Django كقاعدة لصنف User، ويوفر AbstractUser جميع الخصائص والوظائف الأساسية للمستخدمين في Django، أي يمكننا إضافة أي خصائص إضافية نحتاجها إلى صنف User.

class User(AbstractUser):
    phone_number = models.CharField(max_length=20)
    address = models.CharField(max_length=255)

ثم تعريف صنف Vendor، ونرث من صنف User باستخدام class Vendor(User)، ونضيف خاصية type مميزة لصنف Vendor لتحديد نوع المستخدم، ونستطيع إضافة أي خصائص إضافية محددة لصنف Vendor نحتاجها.

class Vendor(User):
    type = models.CharField(max_length=50, default="vendor")
    company_name = models.CharField(max_length=255)
    business_license_number = models.CharField(max_length=20)

ثم تعريف صنف Customer، ونرث من صنف User باستخدام class Customer(User):، ونضيف خاصية type مميزة لصنف Customer لتحديد نوع المستخدم، أيضًا إضافة أي خصائص إضافية محددة لصنف Customer نحتاجها.

class Customer(User):
    type = models.CharField(max_length=50, default="customer")
    shipping_address = models.CharField(max_length=255)
    billing_address = models.CharField(max_length=255)

الآن نستخدم Vendor.objects.create_user لإنشاء بائع جديد ونمرر اسم المستخدم وكلمة المرور وخصائص أخرى إلى الطريقة create_user.

from django.contrib.auth import authenticate

username = "test_vendor"
password = "password1234"

vendor = Vendor.objects.create_user(username=username, password=password, type="vendor")

# ... (إتمام عملية تسجيل البائع)

أو نستخدم Customer.objects.create_user لإنشاء عميل جديد، ونمرر اسم المستخدم وكلمة المرور وخصائص أخرى إلى الطريقة create_user.

from django.contrib.auth import authenticate

username = "test_customer"
password = "password5678"

customer = Customer.objects.create_user(username=username, password=password, type="customer")

# ... (إتمام عملية تسجيل العميل)

وعليك استخدام الطريقة create_user الخاصة بكل صنف، واستيراد جميع النماذج (models) المُستخدمة في الكود.

  • 0
نشر
بتاريخ 4 ساعة قال ياسر مسكين:

يمكنك استخدام التوريث لإنشاء فئات فرعية من الصنف User بهذا الشكل:

from django.contrib.auth.models import AbstractUser
from django.db import models

class User(AbstractUser):
    # خيارات نوع المستخدم
    USER_TYPE_CHOICES = (
        ('vendor', 'Vendor'),
        ('customer', 'Customer'),
    )
    # حقل نوع المستخدم
    user_type = models.CharField(max_length=20, choices=USER_TYPE_CHOICES)

# فئة فرعية لبائع
class Vendor(User):
    # خاصية خاصة بالبائع
    vendor_specific_property = models.CharField(max_length=100)

# فئة فرعية للعميل
class Customer(User):
    # خاصية خاصة بالعميل
    customer_specific_property = models.CharField(max_length=100)

حيث بداية تقوم بتعريف فئة User التي تمثل المستخدم الأساسي وتحتوي على خيارات نوع المستخدم وحقل لتحديد نوع المستخدم. ثم ننشئ فئات فرعية (Vendor وCustomer) ترث من الفئة الأساسية User ونضيف الخصائص الخاصة لكل فئة. هذا الحل يسمح لنا بإنشاء مستخدمين من نوعين مختلفين (بائع وعميل) وتخصيص الخصائص الخاصة بهم بسهولة.

 

بتاريخ 4 ساعة قال Mustafa Suleiman:

في البداية عليك تعريف صنف User الأساسي، حيث نستخدم AbstractUser من Django كقاعدة لصنف User، ويوفر AbstractUser جميع الخصائص والوظائف الأساسية للمستخدمين في Django، أي يمكننا إضافة أي خصائص إضافية نحتاجها إلى صنف User.

class User(AbstractUser):
    phone_number = models.CharField(max_length=20)
    address = models.CharField(max_length=255)

ثم تعريف صنف Vendor، ونرث من صنف User باستخدام class Vendor(User)، ونضيف خاصية type مميزة لصنف Vendor لتحديد نوع المستخدم، ونستطيع إضافة أي خصائص إضافية محددة لصنف Vendor نحتاجها.

class Vendor(User):
    type = models.CharField(max_length=50, default="vendor")
    company_name = models.CharField(max_length=255)
    business_license_number = models.CharField(max_length=20)

ثم تعريف صنف Customer، ونرث من صنف User باستخدام class Customer(User):، ونضيف خاصية type مميزة لصنف Customer لتحديد نوع المستخدم، أيضًا إضافة أي خصائص إضافية محددة لصنف Customer نحتاجها.

class Customer(User):
    type = models.CharField(max_length=50, default="customer")
    shipping_address = models.CharField(max_length=255)
    billing_address = models.CharField(max_length=255)

الآن نستخدم Vendor.objects.create_user لإنشاء بائع جديد ونمرر اسم المستخدم وكلمة المرور وخصائص أخرى إلى الطريقة create_user.

from django.contrib.auth import authenticate

username = "test_vendor"
password = "password1234"

vendor = Vendor.objects.create_user(username=username, password=password, type="vendor")

# ... (إتمام عملية تسجيل البائع)

أو نستخدم Customer.objects.create_user لإنشاء عميل جديد، ونمرر اسم المستخدم وكلمة المرور وخصائص أخرى إلى الطريقة create_user.

from django.contrib.auth import authenticate

username = "test_customer"
password = "password5678"

customer = Customer.objects.create_user(username=username, password=password, type="customer")

# ... (إتمام عملية تسجيل العميل)

وعليك استخدام الطريقة create_user الخاصة بكل صنف، واستيراد جميع النماذج (models) المُستخدمة في الكود.

نجحت الطريقة معي الى حد ما 
هذا هو الكود


USER_TYPE_CHOICES = (
        ('vendor', 'Vendor'),
        ('customer', 'Customer'),
    )

# Create your models here.
class MyUser(AbstractUser):
    # خيارات نوع المستخدم
   
    pass


# فئة فرعية لبائع
class Vendor(MyUser):
    # خاصية خاصة بالبائع
    vendor_specific_property = models.CharField(max_length=100)

    store_deposit_account = models.CharField(max_length = 100 ,default='0000 0000 0000 0000')

    user_type = models.CharField(max_length=20, choices=USER_TYPE_CHOICES , default='vendor')

    class meta:
        verbose_name ='vendor'

# فئة فرعية للعميل
class Customer(MyUser):
    # خاصية خاصة بالعميل
    customer_specific_property = models.CharField(max_length=100)
    lives_in=models.CharField(max_length=50 ,default ='Algeria')
    user_type = models.CharField(max_length=20, choices=USER_TYPE_CHOICES , default='customer')

    class meta:
        verbose_name ='vendor'
admin.site.register(MyUser)
admin.site.register(Customer)
admin.site.register(Vendor)

لكنها تظهر هكذا في صفحة الadmin رغم انني حاولت تحديد الverbose_name
image.png.f5caf333d46e5f7835ecbb983b738362.pngفكيف حل هذه المشكلة؟

ايضا ,هل هناك طريقة للحد من عدد الحقول في صفحة الadmin و اظهار حقول معينة عند الانشاء؟
ف..
image.thumb.png.1d5bfd5f4ef9e85c8a1cce022f8a7f0c.pngهذا اكثر من المرغوب فيه

ايضا @Mustafa Suleiman هل هناك طريقة لفعل هذا من الterminal ؟
 

vendor = Vendor.objects.create_user(username=username, password=password, type="vendor")

 

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...