سعید بهرامی
1 سال پیش توسط سعید بهرامی مطرح شد
8 پاسخ

ایجاد مدل سفارشی username در جنگو

درود دوستان عزیز😀


بنده یک پروژه با استفاده از فریم ورک جنگو شروع کردم و یک اپ در آن ایجاد کردم با عنوان accounts
حالا میخوام در این اپ یک مدل سفارشی ایجاد کنم.
یک مثال میزنم لطفا به این مثال توجه کنید

مثال https://domain.com/@username

دقیقا مشابه سایت راکت (https://roocket.ir/@saeedbahramei) اما با فریم ورک جنگو میخوام ایجاد بشه
(جنگو رو تازه یاد گرفتم نوبم(جونیور) )😁

@hesammousavi
از متخصصان و برنامه نویسان عزیز پیشاپیش ممنونم برای بهترین پاسخگوییتون


ثبت پرسش جدید
پویا باقری
تخصص : برنامه نویس وب
@Pouyab 1 سال پیش آپدیت شد
1
# models.py
from django.db import models
from django.contrib.auth.base_user import BaseUserManager, AbstractBaseUser
from django_jalali.db import models as j_models
from django.core.validators import RegexValidator

class UserManager(BaseUserManager):
    def create_user(self, username, full_name, email, password=None):
        user = self.model(
            username=username,
            full_name=full_name,
            email=self.normalize_email(email)
        )
        user.set_password(password)
        user.save(using=self._db)

        return user

    def create_superuser(self, username, full_name, email, password):
        user = self.create_user(
            username=username,
            full_name=full_name,
            email=self.normalize_email(email),
            password=password
        )
        user.is_active = True
        user.is_staff = True
        user.is_superuser = True

        user.save(using=self._db)
        return user

class User(AbstractBaseUser):
    username = models.CharField(
        max_length=100, unique=True,
        validators=[RegexValidator(regex=r'^@?[a-zA-Z\d]{1,99}$', message='فرمت وارد شده نامعتبر است')],
        verbose_name='نام کاربری')
    full_name = models.CharField(max_length=100, verbose_name='نام')
    email = models.EmailField(max_length=100, unique=True, verbose_name='ایمیل')
    joined_date = j_models.jDateTimeField(auto_now_add=True, verbose_name='تاریخ ثبت نام')
    last_login = j_models.jDateTimeField(auto_now=True, verbose_name='تاربخ آخرین ورود')
    is_active = models.BooleanField(default=False, verbose_name='فعال')
    is_staff = models.BooleanField(default=False, verbose_name='دسترسی کارمندی')
    is_superuser = models.BooleanField(default=False, verbose_name='دسترسی سوپریوزر')

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['full_name', 'email']

    objects = UserManager()

    class Meta:
        verbose_name = 'کاربر'
        verbose_name_plural = 'کاربرها'

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        self.username = f'@{self.username}'

    def __str__(self):
        return self.username

    def has_perm(self, perm, obj=None):
        return self.is_superuser

    def has_module_perms(self, add_label):
        return True
# views.py
from django.views.generic import View
from django.http import HttpResponse
from .models import User
from django.shortcuts import get_object_or_404

# Create your views here.

class UserProfileView(View):
    def get(self, request, username):
        user = get_object_or_404(User, username=username)
        return HttpResponse(
            f'{user.username}\nMy name is {user.full_name}\nMy email: {user.email}',
            content_type='text/plain'
        )
# url.py
from django.urls import path
from . import views

urlpatterns = [
    path('<str:username>', views.UserProfileView.as_view(), name='user-profile-page'),
]

کد زیر رو هم به settings.py اضافه کنید

AUTH_USER_MODEL = 'account.User'

مدل رو از یکی از پروژه هایی که داشتم کپی کردم. میتونید بر حسب نیازتون شخصی سازی کنید. migration هم انجام بدید


پویا باقری
تخصص : برنامه نویس وب
@Pouyab 1 سال پیش آپدیت شد
-1

سلام.
از جایی که اسم اپتون Account هست پس این مدل قرار هست مدل احراز شما باشه. درسته؟


سعید بهرامی
تخصص : طراح و برنامه نویس
@saeedbahramei 1 سال پیش مطرح شد
0

بله دقیقا @Pouyab عزیز

تمامی فرم های ثبت نام و ورود و خروج تغییر پسوورد الی ماشالا در
این اپ قرار داره،پروفایل کاربر هست دیگه در واقع اپ accounts
حالا من میخوام بعنوان مثال کاربری برای خودش یک نام کاربری قرار داده با عنوان username1
وقتی کاربر های دیگه میخوان به پروفایل این کاربر دسترسی داشته باشن به صورت زیر دسترسی پیدا کنن و اونو ببینن


مثال : https://domain.com/@username1


پویا باقری
تخصص : برنامه نویس وب
@Pouyab 1 سال پیش آپدیت شد
1
# models.py
from django.db import models
from django.contrib.auth.base_user import BaseUserManager, AbstractBaseUser
from django_jalali.db import models as j_models
from django.core.validators import RegexValidator

class UserManager(BaseUserManager):
    def create_user(self, username, full_name, email, password=None):
        user = self.model(
            username=username,
            full_name=full_name,
            email=self.normalize_email(email)
        )
        user.set_password(password)
        user.save(using=self._db)

        return user

    def create_superuser(self, username, full_name, email, password):
        user = self.create_user(
            username=username,
            full_name=full_name,
            email=self.normalize_email(email),
            password=password
        )
        user.is_active = True
        user.is_staff = True
        user.is_superuser = True

        user.save(using=self._db)
        return user

class User(AbstractBaseUser):
    username = models.CharField(
        max_length=100, unique=True,
        validators=[RegexValidator(regex=r'^@?[a-zA-Z\d]{1,99}$', message='فرمت وارد شده نامعتبر است')],
        verbose_name='نام کاربری')
    full_name = models.CharField(max_length=100, verbose_name='نام')
    email = models.EmailField(max_length=100, unique=True, verbose_name='ایمیل')
    joined_date = j_models.jDateTimeField(auto_now_add=True, verbose_name='تاریخ ثبت نام')
    last_login = j_models.jDateTimeField(auto_now=True, verbose_name='تاربخ آخرین ورود')
    is_active = models.BooleanField(default=False, verbose_name='فعال')
    is_staff = models.BooleanField(default=False, verbose_name='دسترسی کارمندی')
    is_superuser = models.BooleanField(default=False, verbose_name='دسترسی سوپریوزر')

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['full_name', 'email']

    objects = UserManager()

    class Meta:
        verbose_name = 'کاربر'
        verbose_name_plural = 'کاربرها'

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        self.username = f'@{self.username}'

    def __str__(self):
        return self.username

    def has_perm(self, perm, obj=None):
        return self.is_superuser

    def has_module_perms(self, add_label):
        return True
# views.py
from django.views.generic import View
from django.http import HttpResponse
from .models import User
from django.shortcuts import get_object_or_404

# Create your views here.

class UserProfileView(View):
    def get(self, request, username):
        user = get_object_or_404(User, username=username)
        return HttpResponse(
            f'{user.username}\nMy name is {user.full_name}\nMy email: {user.email}',
            content_type='text/plain'
        )
# url.py
from django.urls import path
from . import views

urlpatterns = [
    path('<str:username>', views.UserProfileView.as_view(), name='user-profile-page'),
]

کد زیر رو هم به settings.py اضافه کنید

AUTH_USER_MODEL = 'account.User'

مدل رو از یکی از پروژه هایی که داشتم کپی کردم. میتونید بر حسب نیازتون شخصی سازی کنید. migration هم انجام بدید


سعید بهرامی
تخصص : طراح و برنامه نویس
@saeedbahramei 1 سال پیش مطرح شد
0

یک دنیا ممنونم جناب @Pouyab باقری عزیز

سپاس👏


سعید بهرامی
تخصص : طراح و برنامه نویس
@saeedbahramei 1 سال پیش مطرح شد
0

درود مجدد @Pouyab 🙂

یک سوال فنی! :
قالب(template) این بخش رو کجا قرار بدم؟
آیا باید در بخش views.py تو کلاس UserProfileView قرار بگیره؟
یا خیر جای دیگری اگر امکانش هست یک سورس تست پیوست کنید ممنون میشم👏


پویا باقری
تخصص : برنامه نویس وب
@Pouyab 1 سال پیش مطرح شد
1

سلام.
فایل views.py رو با مورد زیر جایگزین کنید.
convention به این صورت هست که ابتدا درون اپ account پوشه ای به نام templates ایجاد میکنید. سپس درون پوشه templates پوشه ای به نام اپتون که در این مورد account هست ایجاد میکنید. درون این پوشه فایل HTML رو قرارمیدید.
کاربر دریافتی رو هم به عنوان context پاس میدید.

# views.py
from django.views.generic import View
from django.shortcuts import render
from .models import User
from django.shortcuts import get_object_or_404

# Create your views here.

class UserProfileView(View):
    def get(self, request, username):
        user = get_object_or_404(User, username=username)
        return render(request, 'account/user_profile.html', {
            'user': user
        })

سعید بهرامی
تخصص : طراح و برنامه نویس
@saeedbahramei 1 سال پیش مطرح شد
0

خیلی ممنونم جناب @Pouyab باقری عزیز بابت پاسخگوییتون🤗

یک سوال دیگه هم اگر راهنمایی کنید یک دنیا ممنون میشم🙂
برای تحقیق بیشتر برای این مورد (https://domain.com/@username)
در وب چه عبارت(کلمه کلیدی)رو باید جستجو کنم تا بیشتر بتونم در موردش بخونم
واینکه بیشتر یاد بگیرم


پیشاپیش باز هم ممنونم بابت پاسختون🤗


پویا باقری
تخصص : برنامه نویس وب
@Pouyab 1 سال پیش آپدیت شد
0

سعید عزیز این مورد به صورت کاستوم ایجاد شده. واسه اعتبار سنجی نام کاربری هم یه رجکس جزیی نوشته شده.
تمرین که داشته باشید موارد هزار برابر پیچیده تر از این چیزا هم خود به خود به ذهنتون میاد.
تا جایی که میتونید Document خود Django رو بخونید.


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام