سلام
کد زیر رو توی مدل پست ها گذاشتم تا بین بعدا بتونم تو صفحه جزئیات یک پست اطلاعات نویسنده رو دریافت کنم.
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user")
ولی مشکله که داره اینه که میاد و امکان انتخاب کاربر رو بهم میده! کسی نباید بتونه نویسنده یک مقاله رو انتخاب کنه.
سلام دوست عزیز
اولا چرا on_delete=models.CASCADE, گزاشتید
با این کار اگه یوزر حذف بشه مقالاتتون هم باهاش میپره
از بقیه گزینه ها استفاده کنید مثل
models.SET_NULL
ثانیا این رو شما باید توی فرم هندل کنید
به طوری که شما این فیلد ها رو به
superuser
نشون میدید و به بقیه نشون نمی دید در نهایت وقتی فرم اومد سمتتون و دریافتش کردید خواستید سیو کنید این طور عمل می کنید
m = x.save(commit=False)
m.writher = "y"
m.z = "m"
m.status = "draft"
m.save()
یعنی یه سوپر یوزر می تونه به جای کس دیگری مقاله بنویسه ولی یه کاربر عادی فقط جای خودش می تونه مقاله بنویسه
و مقاله هایی هم که می نویسه پیش نویسن و نیاز به تایید دارند
در نتیجه باید این موارد رو توی ویو و تمپلت حل کنید
موفق باشید
این مورد رو تو پنل مدیریت ادمین اضافه کردم و دسترسی به فرم های ادمین ندارم. (تو پنل مدیریت و با کاربر superuser دارم مقاله رو اضافه می کنم).
شما توسط ابسترکت یوزر این فیلد ها رو پیاده کردید؟
متوجه نشدم.
این مدل رو فقط از طریق پنل مدیریت پیش فرض جنگو مدیریت میکنم .
من یوزر رو از
from django.contrib.auth.models import User
ایمپورت کردم
class Article(models.Model):
title = models.CharField(max_length=120, verbose_name='عنوان')
user = models.ForeignKey(User, on_delete=models.SET_NULL, related_name="user", null=True)
ببینید ما تو پنل ادمین یه سری فیلتر ها داریم مثل read only
field set
شما همون read only در جنگو رو سرچ کنید
بعد می تونید اون فیلد فقط خواندنی بشه خب می پرسید چطوری پرش کنم که خالی نباشه اون هم باید متد
save رو با super که از متد های پایتونه اور رایت کنید
save()
وقتی روی ذخیره تو پنل ادمین بزنید فراخوانی میشه و یه سری چیزا دریافت می کنه اول self بعد request بعد obj بعد ..... که مقادیر دقیقش توی داکیومنت گفته شده من از حفظ می گم
نتیجه گیری:
۱ - تغییر پنل ادمین جنگو رو سرچ کنید از وب سایت گیت یه بانویی هست به زبان انگلیسی یه سری چیزا از پنل ادمین تدریس کرده ویدئو هست اونو نگاه کنید که درک بیشتری از پنل داشته باشید
۲ - فیلد انتخاب کاربر رو فقط خواندنی کنید برای کاربرایی که superuser نیستند
۳ - وقتی روی دکمه save کلیک کنید تابع save() صدا زده می شه این تابع رو طوری اوررایت کنید که اون فیلد رید آنلی رو براتون پر کنه
۴ - می تونید با استفاده از fields set اصلا اون منوی انتخاب رو نشون ندید
اگه پیدا کنم براتون نمونه کد میزارم به نفعتون تغییرش بدید
class Group_Category_Admin(admin.ModelAdmin):
#در اینجا که مشخصه جی به چیه
list_display = ["name","count_member", "class_time", "active"]
search_fields = ["userName"]
# این تابع فیلد ها فقط خواندنی رو مشخص می کنه
def get_readonly_fields(self, request, obj=None): # آرگومان های ورودی
if request.user.is_superuser: # اگر کاربر ادمین بود
return [] # همه رو نشونش بده
else:
# اگه نبود چند تا رو در حالت فقط خواندن بردم
return ["name", "class_time", "active"]
# این تابع فیلد هایی رو که می خوام نمایش بدم رو نشون میده
def get_fieldsets(self, request, obj=None): #آرگومان ها ورودیش
if request.user.is_superuser: #اگه کاربر ادمین بود
return (
# بیا یه سر تیتر با عنوان اطلاعات.... بزن
#فیلدای نام کلاس تایم و وضعیت رو بزار
('اطلاعات کلاس', {
'fields': (('name'), ('class_time', 'active'))
}), #یه سر تیترم بزن برا انتخاب کلاس و یوزرکلاسس بزار
('انتخاب کلاس', {
'fields': ('user_classes',),
}),
)
else: #اگه کاربر عادی بود
return ( # یه سر تیتر بزار برا این فیلدا
('اطلاعات کلاس', {
'fields': (('name'), ('class_time', 'active'))
}), # یه سر تیتر برا این فیلدا دیگه یوزر کلاسس رو نگفتم بزاره
('انتخاب کلاس', {
'fields': ('join',),
}),
)
# اینجا هم متد سیو که وقتی رو سیو کلیک کرد چی کارش کنم
def save_model(self, request, obj, form, change):
if obj.join: # obj همون فایلی که داره ذخیره میشه
obj.user_classes.add(request.user)
if not obj.join:
obj.user_classes.remove(request.user)
obj.join = False
super().save_model(request, obj, form, change) #متد رو اوررایتر کردم
# که خاصیت های خودشم حفظ کنه کارای منم بکنه
admin.site.register(Group_Category, Group_Category_Admin)
واقعا ازت ممنونم ، من تازه کارم و چند روزی بود تو این مورد گیر کرده بودم و خیلی خیلی متشکرم که بیوقفه بهم کمک کردی تا مرحله اخر که بتونم چیزی که میخوام رو پیاده سازی کنم.
نمونه کد اخری که فرستادی واقعا خیلی کمکم کرد چون به اشتباه بجای فایل ادمین داشتم متد save رو تو مدل اورراید میکردم.
اومدم تو فایل admin مقالم کد زیر رو گذاشتم
def save_model(self, request, obj, form, change):
obj.user = request.user
super().save_model(request, obj, form, change) # متد رو اوررایتر کردم
از طریق کد بالا تونستم تو فیلد یوزری که تو مدل داشتم اطلاعات کاربر (ایدیش) رو ثبت کنم.
بازم ممنون