• 1400/02/23

دریافت اطلاعات کاربر از یک مقاله :

سلام

کد زیر رو توی مدل پست ها گذاشتم تا بین بعدا بتونم تو صفحه جزئیات یک پست اطلاعات نویسنده رو دریافت کنم.

user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user")

ولی مشکله که داره اینه که میاد و امکان انتخاب کاربر رو بهم میده! کسی نباید بتونه نویسنده یک مقاله رو انتخاب کنه.

  • 1400/02/23
  • ساعت 19:59

سلام دوست عزیز

اولا چرا on_delete=models.CASCADE,  گزاشتید

با این کار اگه یوزر حذف بشه مقالاتتون هم باهاش میپره

از بقیه گزینه ها استفاده کنید مثل 

models.SET_NULL

ثانیا این رو شما باید توی فرم هندل کنید

به طوری که شما این فیلد ها رو به 
superuser

نشون میدید و به بقیه نشون نمی دید در نهایت وقتی فرم اومد سمتتون و دریافتش کردید خواستید سیو کنید این طور عمل می کنید

m = x.save(commit=False)
m.writher = "y"
m.z = "m"
m.status = "draft"
m.save()

یعنی یه سوپر یوزر می تونه به جای کس دیگری مقاله بنویسه ولی یه کاربر عادی فقط جای خودش می تونه مقاله بنویسه

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

در نتیجه باید این موارد رو توی ویو و تمپلت حل کنید

موفق باشید


  • 1400/02/23
  • ساعت 20:21

این مورد رو تو پنل مدیریت ادمین اضافه کردم و دسترسی به فرم های ادمین ندارم. (تو پنل مدیریت و با کاربر superuser دارم مقاله رو اضافه می کنم).


  • 1400/02/23
  • ساعت 22:30

شما توسط ابسترکت یوزر این فیلد ها رو پیاده کردید؟


  • 1400/02/24
  • ساعت 00:07

متوجه نشدم.

این مدل رو فقط از طریق پنل مدیریت پیش فرض جنگو مدیریت میکنم .

من یوزر رو از

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)


  • 1400/02/24
  • ساعت 01:56

ببینید ما تو پنل ادمین یه سری فیلتر ها داریم مثل read only 

field set

شما همون read only در جنگو رو سرچ کنید

بعد می تونید اون فیلد فقط خواندنی بشه خب می پرسید چطوری پرش کنم که خالی نباشه اون هم باید متد 

save رو با super که از متد های پایتونه اور رایت کنید 

save()

وقتی روی ذخیره تو پنل ادمین بزنید فراخوانی میشه و یه سری چیزا دریافت می کنه اول self بعد request بعد obj بعد ..... که مقادیر دقیقش توی داکیومنت گفته شده من از حفظ می گم 

نتیجه گیری:

۱ - تغییر پنل ادمین جنگو رو سرچ کنید از وب سایت گیت یه بانویی هست به زبان انگلیسی یه سری چیزا از پنل ادمین تدریس کرده ویدئو هست اونو نگاه کنید که درک بیشتری از پنل داشته باشید

۲ - فیلد انتخاب کاربر رو فقط خواندنی کنید برای کاربرایی که superuser نیستند

۳ - وقتی روی دکمه save کلیک کنید تابع save() صدا زده می شه این تابع رو طوری اوررایت کنید که اون فیلد رید آنلی رو براتون پر کنه

۴ - می تونید با استفاده از fields set اصلا اون منوی انتخاب رو نشون ندید

اگه پیدا کنم براتون نمونه کد میزارم به نفعتون تغییرش بدید


  • 1400/02/24
  • ساعت 02:08
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)

  • 1400/02/24
  • ساعت 12:15

واقعا ازت ممنونم ، من تازه کارم و چند روزی بود تو این مورد گیر کرده بودم و خیلی خیلی متشکرم که بیوقفه بهم کمک کردی تا مرحله اخر که بتونم چیزی که میخوام رو پیاده سازی کنم.

نمونه کد اخری که فرستادی واقعا خیلی کمکم کرد چون به اشتباه بجای فایل ادمین داشتم متد save  رو تو مدل اورراید میکردم.

 

اومدم تو فایل admin مقالم کد زیر رو گذاشتم

    def save_model(self, request, obj, form, change):
        obj.user = request.user

        super().save_model(request, obj, form, change)  # متد رو اوررایتر کردم

از طریق کد بالا تونستم تو فیلد یوزری که تو مدل داشتم اطلاعات کاربر (ایدیش) رو ثبت کنم.

 

 

بازم ممنون


logo-samandehi