بنده یک پروژه با استفاده از فریم ورک جنگو شروع کردم و یک اپ در آن ایجاد کردم با عنوان accounts
حالا میخوام در این اپ یک مدل سفارشی ایجاد کنم.
یک مثال میزنم لطفا به این مثال توجه کنید
دقیقا مشابه سایت راکت (https://roocket.ir/@saeedbahramei) اما با فریم ورک جنگو میخوام ایجاد بشه
(جنگو رو تازه یاد گرفتم نوبم(جونیور) )😁
@hesammousavi
از متخصصان و برنامه نویسان عزیز پیشاپیش ممنونم برای بهترین پاسخگوییتون
# 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 هم انجام بدید
تمامی فرم های ثبت نام و ورود و خروج تغییر پسوورد الی ماشالا در
این اپ قرار داره،پروفایل کاربر هست دیگه در واقع اپ accounts
حالا من میخوام بعنوان مثال کاربری برای خودش یک نام کاربری قرار داده با عنوان username1
وقتی کاربر های دیگه میخوان به پروفایل این کاربر دسترسی داشته باشن به صورت زیر دسترسی پیدا کنن و اونو ببینن
# 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 هم انجام بدید
یک سوال فنی! :
قالب(template) این بخش رو کجا قرار بدم؟
آیا باید در بخش views.py تو کلاس UserProfileView قرار بگیره؟
یا خیر جای دیگری اگر امکانش هست یک سورس تست پیوست کنید ممنون میشم👏
سلام.
فایل 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
})
یک سوال دیگه هم اگر راهنمایی کنید یک دنیا ممنون میشم🙂
برای تحقیق بیشتر برای این مورد (https://domain.com/@username)
در وب چه عبارت(کلمه کلیدی)رو باید جستجو کنم تا بیشتر بتونم در موردش بخونم
واینکه بیشتر یاد بگیرم
سعید عزیز این مورد به صورت کاستوم ایجاد شده. واسه اعتبار سنجی نام کاربری هم یه رجکس جزیی نوشته شده.
تمرین که داشته باشید موارد هزار برابر پیچیده تر از این چیزا هم خود به خود به ذهنتون میاد.
تا جایی که میتونید Document خود Django رو بخونید.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟