• پنجشنبه ۱۳ اردیبهشت ۱۴۰۳
نویسنده : سید طه آیت اللهی
آخرین آپدیت : 1400/09/21
زمان مورد نیاز برای خواندن : 10

آموزش قراردادن سرچ، فیلتر و اکشن ها در پنل ادمین فریمورک جنگو(django) | tmayt

آموزش قراردادن سرچ، فیلتر، اکشن ها و ... در پنل ادمین فریمورک جنگو(django)

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

چگونه به پنل ادمین جنگو سرچ را اضافه کنیم؟

برای اینکار میتوانید به راحتی وارد فایل admin.py در app خود می شویم و به جای admin.site.register(MyModelName) مدل خود را به کمک دکوراتور ریجستر (register) میکنیم و کد خود را به این صورت تغییر میدهیم.

from home.models import Product
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    search_fields = ("title",'description')

در کد بالا به کمک دکوراتور admin.register مدل Product را به کمک کلاس جدیدی که ساختیم به نام ProductAdmin رجیستر کردیم.

کلاس ProductAdmin را ارثبری کردیم از کلاس admin.ModelAdmin و حالا میتوانیم از مقادیر های تعریف شده در کلاس والد استفاده کنیم و آنها را مقدار دهی کنیم یکی از مقدار ها مقدار search_fields میباشد که شما برای داشتن قابلیت سرچ روی این مدل در پنل ادمین باید به صورت بالا فیلد ها را به آن معرفی کنید و بگویید که کلمات سرچ شده در کدام فیلد ها جست و جو شود، دقت داشته باشید که این مقدار باید به صورت تاپل قرار بگیرد و اگر فقط یک فیلد را میخواهید اختصاص دهید باید به صورت search_fields = ('title',) مقدار دهی را انجام دهید.

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

search in admin django | قابلیت سرچ در ادمین جنگو

چگونه به پنل ادمین جنگو قابلیت فیلتر را اضافه کنیم؟

برای قابلیت فیلتر هم میتوانید دوباره به کلاس ProductAdmin رجوع کنیم و اینبار list_filter را مقدار دهی کنیم.

from django.contrib import admin
from home.models import Product

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    search_fields = ("title",'description')
    list_filter = ('price',)
    

این مقدار هم مانند search_fields باید به صورت تاپل مقداردهی شود و شما در آن میتوانید charfield , integerfield, booleanfield, foreign key, manytomanyfield, ... را قرار دهید تا خود جنگو تشخیص دهد با توجه به نوع آن چگونه فیلترینگ را برای شما بسازد.

حال اگر به پنل ادمین جنگو بروید فیلترینگ بر اساس قیمت برای شما اضافه خواهد شد.

filtering in admin django | قابلیت فیلترینگ در پنل ادمین جنگو

تابع __str__ در ادمین جنگو چه کاری انجام میدهد؟

خب برای ادامه چند محصول به صورت تستی به ادمین اضافه کردیم و ظاهر به شکل زیر تغییر کرد.

admin model interface django | شکل ظاهری مدل در ادمین جنگو

همانطور که مشاهده میکنیم هر محصول را به صورت یک product object نشان میدهد و با کلیک کردن روی هرکدام میتوانید وارد آن محصول شوید اما به جای کلمه ی product object میخواهیم نام (title) هر محصول را نمایش دهد، برای اینکار وارد فایل models.py میشویم و به کلاس مدل مربوطه رجوع میکنیم و به آن تابع __str__ را اضافه میکنیم.

تابع __str__ تابعی از قبل مشخص شده در پایتون هست و محدود به جنگو نمیشود و کار اصلی این تابع این است که زمانی که شما یک شئ از یک کلاس میسازید و جایی فراخوانی میکنید اگر برای برنامه اتربیوت (attribute) یا مقدار خاصی از داخل شئ را صدا نزده باشید این تابع مقداری را برای شما بر میگرداند.

در حال حاضر نیز چون این تابع در کلاس Product وجود ندارد شئ product را به صورت پیشفرض Product Object  میخواند 

بنابراین کد را به این صورت تغییر میدهیم :

from django.db import models


class Product(models.Model):
    price = models.IntegerField()
    description = models.TextField()
    title = models.CharField(max_length= 200)
    image = models.ImageField(upload_to = "product")

    def __str__(self):
        return self.title

    class Meta:
        verbose_name_plural = "محصولات"
        verbose_name = "محصول"

دقت داشته باشید که خروجی این تابع همیشه باید یک رشته متنی(string) باشد

حال پنل ادمین به این شکل تغییر میکند.

تابع __str__ در ادمین جنگو

چگونه مدل خود را در ادمین جنگو به صورت جدول نمایش دهیم؟

برای اینکار دوباره وارد فایل admin.py میشویم و در آنجا مقدار list_display را با تاپلی از فیلد هایی که میخواهیم به صورت جدول نمایش داده شوند مقداردهی میکنیم.

بنابراین کد به شکل زیر میشود.

from django.contrib import admin
from home.models import Product

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    search_fields = ("title",'description')
    list_filter = ('price',)
    list_display = ("title",'price','description')

و در پنل این کد به شکل تصویر زیر در می آید.

نمایش داده های داخل یک مدل به صورت جدول در ادمین جنگو

چگونه اکشن به پنل ادمین جنگو اضافه کنیم؟

اگر دقت کرده باشید در بالای هر مدل که وارد میشوید یک دراپ داون به نام اقدام (action) وجود دارد که این اقدام را اگر باز کنید در آن قابلیت حذف ردیف ها وجود دارد زمانی که چند ردیف را به کمک تیک کنار هر ردیف انتخاب کنید.

حال میخواهیم ویژگی و اقدامی جدید به این قسمت اضافه کنیم برای اینکار وارد admin.py میشویم و از دکوراتور admin.action یک اکشن جدید تعریف و میکنیم که ساختار آن را در کد زیر میتوانید ببینید.

from django.contrib import admin
from home.models import Product

@admin.action(description='صفر کردن قیمت محصول')
def price_to_zero(modeladmin, request, queryset):
    for a in queryset:
        a.price = 0
        a.save()


@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    search_fields = ("title",'description')
    list_filter = ('price',)
    list_display = ("title",'price','description')
    actions = [price_to_zero]

در کد بالا یک اکشن (که در اصل یک تابع است به نام price_to_zero) ساختیم و یک توضیح (description) برای نمایش آن در پنل ادمین قرار دادیم، این تابع 3 ورودی میگیرد که به ترتیب مشخص شده است مقدار queryset برابر شئ های مدلی است که این اکشن را برای آنها فراخوانی کرده اند در پنل.

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

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

add action in admin django | اضافه کردن اکشن به ادمین جنگو

پس از فشردن دکمه، برو (go) میبینیم که قیمت یا همان فیلد price محصولات انتخاب شده 0 میشود.

test action in admin django |تست کردن اکشن در ادمین جنگو

 

آموزش بعدی ()

آموزش قبلی (آموزش شخصی سازی کامل ادمین جنگو و تغییر تم ظاهری به همراه فونت فارسی در فریمورک جنگو(django) | tmayt)

 

نظرات(3)


OnewPlelm

Waintraub SE, Tuchman V, Hackensack NJ The role of preoperative neoadjuvant cytoreductive dose dense bevacizumab plus docetaxel followed by bevacizumab doxorubicin cyclophosphamide regimen in locally advanced operable breast cancer abstract e11524 <a href=https://brandviagra.sbs>when is the best time to take viagra</a>


1401/11/06 پاسخ


مهرداد

ادمین جنگو چقدر قابل تغییر بود نمیدونستیم 🤦‍♂️❤


1400/10/19 پاسخ


احمد

چقدر دنبالش بودم


1400/10/19 پاسخ

نظر خود را وارد کنید