آموزش جنگو (Basic) : جلسه چهارده | شخصی سازی ادمین پنل

در این جلسه به بررسی چگونگی تغییر و شخصی سازی ادمین پنل خواهیم پرداخت . با ما همراه باشید . آموزش جنگو : جلسه چهارده | شخصی سازی ادمین پنلشخصی سازی ادمین پنلموضوعاتی که تا الان خوانده اید ,در ادامه مقالات به بررسی پیشرفته آنها خواهیم پرداخت . اما قبل از آن هنوز یک مبحث برای مرور باقی مانده است . در تمامی اپ های شما فایلی با نام admin.py وجود دارد که ما از آن برای اضافه کردن پنل کنترل دیتابیس شما در ادمین وبسایت استفاده کردیم . (()admin.site.register)اما موضوع مورد بحث این است که شما می توانید با ایجاد تنظیماتی در این فایل , پنل ادمین جنگو را شخصی سازی کنید و کار های بیشتری از این قبیل ...بسیار خب ,بیایید ترتیب قرار گیری فیلد ها را کمی مرتب کنیم . فایل polls/admin.py را به صورت زیر تغییر دهید .from django.contrib import admin from .models import Question class QuestionAdmin(admin.ModelAdmin): fields = ['pub_date', 'question_text'] admin.site.register(Question, QuestionAdmin)هر زمان که شما نیاز داشته باشید تا در پنل ادمین تغییراتی ایجاد کنید (تغییرات ظاهری و چگونگی کارکرد آن برای هر جدول از دیتابیس) شما باید مراحل زیر را دنبال کنید .1-کلاسی را ایجاد کنید که نام آن ترکیب اسم مدل و Admin باشد .2-آن کلاس را به عنوان آرگومان به admin.site.register ارسال کنید .تغییری که در بالا انجام دادیم این بود که ترتیب قرار گیری فیلد ها را برای نمایش دادن آنها جا به جا کردیم . در واقع متغییر هایی که در کلاس تعریف می شوند برای شما این تغییرات را رقم می زنند . (در اینجا fields باید یک لیست باشد که ترتیب قرارگیری و نمایش فیلد های یک جدول یا مدل را در خود دارا باشد .)تغییر ترتیب فیلد ها در ادمین پنلشاید بگویید فایده این کار چیست ؟ بله این کار برای دو فیلد شاید فایده خاصی نداشته باشد . اما هنگامی که شما بیشتر از 9 یا 10 فیلد در مدل خود داشته باشید ,ترتیب و اولویت فیلد ها برای شما اهمیت پیدا می کند .و شاید شما بخواهید هر چند فیلد را در یک دسته بندی خاص تعریف کنید . به تصویر و کد زیر نگاه کنید .from django.contrib import admin from .models import Question class QuestionAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question_text']}), ('Date information', {'fields': ['pub_date']}), ] admin.site.register(Question, QuestionAdmin)نکته : مقدار اول هر کدام از تاپل های درون لیست fieldset ,نام سرتیتر هر کدام از بخش ها است و مقدار دوم فیلد هایی هستند که باید در همان دسته قرار بگیرند . به تصویر زیر نگاه کنید .دسته بندی فیلد ها در ادمین پنلاضافه کردن فرم ایجاد مدل های مرتبطشما اکنون می توانید در ادمین پنل در مدل Question سوالاتی را ایجاد کنید ,اما هر سوال دارای چند choice یا انتخاب است که فیلد آنها در هنگام ایجاد سوال وجود دارد , اما فرمی برای ایجاد خود choice وجود ندارد . برای حل این مشکل شما دو راه دارید .در polls/admin.py مدل خود را register کنید .from django.contrib import admin from .models import Choice, Question # ... admin.site.register(Choice)حال می توانید گزینه Add Choice را بزنید تا انتخاب جدیدی را اضافه کنید . ظاهر آن به شکل زیر است :ایجاد فرم های اضافی در ادمین پنلدر این فرم , Question یک select box یا باکسی است که محتویات آن را , شی های درون مدل Question تشکیل می دهند . این یعنی این باکس حاوی تمام شی های مدل Question است که می توانید از میان آنها یکی را انتخاب کنید . در واقع وقتی شما از Forignkey استفاده میکنید ,جنگو می داند باید این چنین کادری را ایجاد کند . در حال حاضر ما فقط یک سوال داریم پس در این باکس شما فقط یک شی را خواهید دید .جنگو موقعیت های مختلفی را برای شما در نظر گرفته است و برای هر کدام راه حلی نیز قرار داده است . برای مثال فرض کنید در حین اضافه کردن یک choice شما نیاز داشته باشید تا یک question یا سوال جدید نیز ایجاد کنید . برای این کار فقط کافیست بر روی علامت به علاوه در کنار فیلد کلیک کنید . پنجره ای که باز می شود, حاوی فرم ایجاد question است . پس از سیو کردن آن شما می توانید آن را در کادر question مشاهده کنید .ولی این روش درستی نیست . شما باید ابتدا سوالی را ایجاد کنید , سپس هر کدام از گزینه ها را باید جدا جدا ایجاد کنید و به همدیگر پیوند دهید . بهتر است کاری کنیم وقتی داریم سوال ها را ایجاد می کنیم ,همزمان بتوانیم گزینه ها را در همان فرم برای همان سوال خاص بسازیم . بیایید این کار را انجام بدهیم .کافی است ()Register را برای مدل choice حذف کنید و کد زیر را به جای آن قرار دهید .from django.contrib import admin from .models import Choice, Question class ChoiceInline(admin.StackedInline): model = Choice extra = 3 class QuestionAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question_text']}), ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}), ] inlines = [ChoiceInline] admin.site.register(Question, QuestionAdmin)ایجاد فرم های اضافی در ادمین پنل 2اگر به عکس بالا نگاهی بیندازید ,میفهمید که حال می توانید گزینه ها را در همان فرم ایجاد سوال ایجاد کنید . به طور پیش فرض میتوانید 3 گزینه برای هر سوال ایجاد کنید .جنگو این کار را این گونه انجام می دهد :هنگامی که شما برای ایجاد سوالی به فرم مربوطه می روید , جنگو به شما سه اسلات می دهد که درون هرکدام فرمی برای ایجاد یک گزینه یا choice است . (شما این کار را به کمک تعریف extra در admin.py انجام دادید) .همچنین اگر نیاز به ایجاد گزینه های بیشتر یا اسلات های بیشتر داشتید , می توانید بر روی لینک Add another Choice در پایین صفحه کلیک کنید تا اسلاتی دیگر برای شما اضافه شود . برای حذف هر اسلات نیز بر روی آیکون ضربدر هر اسلات کلیک کنید .حذف و اضافه کردن اسلات در ادمین پنلاما مشکل کوچکی وجود دارد . فرم های ایجاد choice فضای زیادی از صفحه را می گیرند . برای خطی نمایش دادن آن کد فایل admin.py را به صورت زیر تغییر دهید . (منظور ارث بری کلاس choice شماست!)class ChoiceInline(admin.TabularInline): #...با ارث بری از این کلاس tabularinline شما می توانید فرم ها را به صورت خطی در آوردید . به شکل زیر نگاه کنید تا منظور من را بهتر متوجه شوید .فرم های خطی در ادمین پنلهمچنین ستونی تحت عنوان ?DELETE برای شما ایجاد شده است که به وسیله آن میتوانید اسلات ها را حذف کنید .شخصی سازی صفحه لیست رکورد های درون دیتابیساکنون که صفحه مدیریت زیبا به نظر میرسد ,بیایید کمی روی زیبایی صفحه لیست سوالات نیز کار کنیم . (منظور صفحه ای است که تمام سوالات را به ما نشان می دهد) :شخصی سازی صفحه لیست رکورد های درون دیتابیسجنگو در اینجا فقط ()str هر شی را به شما نشان می دهد . اما گاهی اوقات بهتر است فیلد های دیگری از یک شی نیز در صفحه لیست برای شما نشان داده شوند . شما این کار را به کمک تعریف متغییر display_list در کلاس مربوط به همان مدل انجام می دهیم . این متغییر یک تاپل حاوی نام فیلد هایی است که می خواهید هر کدام به صورت یک ستون در صفحه لیست نشان داده شوند . کد زیر را در admin.py بنویسید .class QuestionAdmin(admin.ModelAdmin): # ... list_display = ('question_text', 'pub_date', 'was_published_recently')همچنین شما میتوانید متد های مدل خود را نیز در تاپل مربوطه قرار دهید . برای مثال ما در اینجا دو فیلد و یک متد از مدل question را درون آن قرار داده ایم . این صفحه ایندکس یا لیست سوال ها بعد از تغییر است :تغییر نحوه نمایش اشیا در ادمین پنلحال شما می بینید که هر فیلد یا متدی که در تاپل قرار داده بودید , به صورت یک ستون در صفحه لیست بندی سوالات قرار دارد .شما همچنین می توانید بر روی تیتر هر ستون کلیک کنید تا شی ها به ترتیب مقدار فیلد های همان ستون مرتب سازی شوند . البته این مرتب سازی برای متود ها کار نمی کند . این یعنی با کلیک بر روی تیتر WAS PUBLISHED RECENTLY اتفاق خاصی نمی افتد .برای حل این مشکل می توانید از دکوریتور (decorator) استفاده کنید . در فایل polls/models.py از ()display برای این کار استفاده میکنیم :from django.contrib import admin class Question(models.Model): # ... @admin.display( boolean=True, ordering='pub_date', description='Published recently?', ) def was_published_recently(self): now = timezone.now() return now - datetime.timedelta(days=1) <= self.pub_date <= nowحال شما میتوانید در متدها نیز قابلیت مرتب سازی را داشته باشید . (کد ها نیازی به توضیح ویژه ای ندارند . اگر مشکلی برای درک آنها دارید , کمی در گوگل درباره آنها مطالعه کنید )شما همچنین میتوانید اشیا را بر اساس یکی از فیلد های آنها فیلتر کنید . برای این کار فقط کافیست تا متغییری با نام list_filter در کلاس مربوطه ایجاد کنید و درون آن لیستی از نام فیلد هایی که می خواهید بر اساس آنها اشیا را فیلتر کنید بسازید . به فایل polls/admin.py بروید و متغییر زیر را در کلاس QuestionAdmin ایجاد کنید .list_filter = ['pub_date']جنگو پس از این برای شما کادری کوچک در کنار لیست اشیا ایجاد میکند تا بتوانید آنها را بر اساس فیلد pub_date فیلتر کنید . (برای مثال فقط اشیایی را نشان بده که فیلد pub_date آنها مربوط به 7 روز گذشته باشند )استفاده از فیلتر ها در ادمین پنلنکته :گزینه های فیلتر ها بر اساس نوع فیلدی که انتخاب کرده اید ایجاد می شوند . برای مثال چون pub_date فیلد تاریخ و زمان است ,جنگو به شما گزینه های Any date , past 7 days , this month , this year را می دهد . حال اگر فیلد شما یک BoleanField بود ,جنگو به شما گزینه های Trueو False را میداد .بسیار خب ,شما اکنون میتوانید اشیا را فیلتر کنید . اما بیایید کاری کنیم که بتوانیم آنها را بر اساس فیلدی خاص جستجو نیز کنیم . متغییر زیر را نیز در کنار متغییر قبلی قرار دهید :search_fields = ['question_text']این به شما یک فیلد سرچ در بالای صفحه لیست اشیا می دهد . وقتی شما چیزی را در آنجا تایپ می کنید ,جنگو آن را به شکل یک جستجو در میان فیلد question_text هر شی می بیند . پس شما در واقع در میان question_text سرچ خواهید کرد و نتایج را خواهید دید . البته که شما میتوانید از فیلد های دیگر نیز استفاده کنید . (جنگو برای این کار از دستور LIKE در sql استفاده میکند . به همین دلیل شما فیلد بخصوصی را باید برای سرچ در نظر بگیرید , زیرا جنگو می خواهد در واقع عملیات limit را برای دیتابیس شما انجام دهد .)به یاد داشته باشید که بسیار تنظیمات مختلفی در جنگو وجود دارد که به وسیله آنها می توانید ظاهر و نحوه نمایش اشیا در ادمین پنل را تغییر دهید . در صورت لزوم می توانید در داکیومنت خود جنگو آنها را بررسی کنید . در این جلسه به بررسی نحوه ایجاد تغییر در ادمین پنل جنگو پرداختیم . در جلسه بعدی به بررسی چگونگی تغییر ظاهر کل ادمین پنل در جنگو خواهیم پرداخت .