رجیستر کردن اتوماتیک تمام مدل‌ها در جنگو ادمین

August 2021

رجیستر کردن اتوماتیک تمام مدل‌ها در جنگو ادمین

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

 

ادمین پنل جنگو یکی از قوی ترین و محبوب ترین ویژگی های جنگو است. هنگامی که مدل ها را ایجاد می کنیم، باید آنها را در ادمین پنل ثبت کنیم تا بتواند داده ها را بخواند و رابط کاربری را برای آن پر کند.

 

اگر پروژه جنگو مدلهای زیادی دارد یا پایگاه داده قدیمی دارد، افزودن همه آن مدلها به admin panel یک کار خسته کننده می شود. برای خودکارسازی این فرایند ، می توانیم به طور برنامه ریزی شده همه مدلهای پروژه را واکشی کرده و آنها را در admin panel ثبت کنیم.

 


 

یکی از فایل‌های admin.py را باز کرده و این کد را به آن اضافه کنید.

 

from django.apps import apps


models = apps.get_models()

for model in models:
    admin.site.register(model)

 

با این کار همه مدل ها در همه appها آورده شده و با admin panel ثبت می شوند.

 

اگر ما به طور خودکار همه مدل ها را ثبت کنیم ، این خوب کار می کند. با این حال ، اگر برخی از مدل ها را به صورت جداگانه با سفارشی سازی ثبت کنیم و دوباره سعی کنیم همه مدل ها را در برنامه های خود ثبت کنیم ، درگیری وجود خواهد داشت زیرا جنگو اجازه نمی دهد یک مدل را دو بار ثبت کنید.

 

 

بنابراین ، ما باید مطمئن شویم که این قطعه کد در انتهای فایل admin.py اجرا می شود و باید از مدل هایی که قبلاً ثبت شده اند چشم پوشی کند. ما می توانیم این کد را در انتهای فایل admin.py اضافه کنیم.

 

from django.apps import apps
from book.models import Book

class BookAdmin(admin.ModelAdmin):
    list_display = ('name', 'author')

# model registered with custom admin
admin.site.register(Book, BookAdmin)

# all other models
models = apps.get_models()

for model in models:
    try:
        admin.site.register(model)
    except admin.sites.AlreadyRegistered:
        pass

 

اکنون مدلهای ثبت شده دستی، ابتدا ثبت می شوند و سپس مدلهای باقی مانده به صورت خودکار ثبت می شوند.

 

class Book(models.Model):
    name = models.CharField(max_length=100)
    author = models.ForeignKey(Author, null=True)
    borrowed = models.CharField(max_length=100, default='')

    def __str__(self):
        return self.name

 

اگر به صفحه مدل در admin برویم ، مدلهای ثبت شده به صورت خودکار فقط 1 ستون مانند این را نشان می دهند.

 

ثبت اتوماتیک مدل‌ها در ادمین پنل جنگو

 

این رابط برای کاربرانی که می خواهند داده ها را ببینند مفید نیست. برای بهبود آن ، می توانیم ListAdminMixin ایجاد کنیم ، که list_display را با تمام فیلدهای موجود در مدل پر می کند.

 

 

ما می توانیم یک کلاس مدیریت جدید ایجاد کنیم که زیر کلاس ListAdminMixin & ModelAdmin را قرار می دهد. وقتی مدل را ثبت می کنیم می توانیم از این کلاس مدیریت استفاده کنیم تا همه فیلدهای مدل در admin نشان داده شود.

 

from django.apps import apps
from django.contrib import admin


class ListAdminMixin(object):
    def __init__(self, model, admin_site):
        self.list_display = [field.name for field in model._meta.fields]
        super(ListAdminMixin, self).__init__(model, admin_site)


models = apps.get_models()
for model in models:
    admin_class = type('AdminClass', (ListAdminMixin, admin.ModelAdmin), {})
    try:
        admin.site.register(model, admin_class)
    except admin.sites.AlreadyRegistered:
        pass

 

اکنون ، هر زمان که ما یک مدل جدید ایجاد می کنیم یا یک فیلد جدید به یک مدل موجود اضافه می کنیم ، به طور خودکار در admin منعکس می شود.

 

ثبت اتوماتیک مدل‌ها در ادمین پنل جنگو

 

با این کار ، هر زمان که مدل ها به برنامه های ما اضافه می شوند ، می توانیم از ثبت مدل با admin اجتناب کنیم.

مقالات مرتبط

چک لیست امنیتی برای قبل از دیپلوی جنگو

بازبینی فریمورک جنگو - مزایا و معایب

شش تگ تمپلیت جنگو، که در هر آموزشی پیدا نمی‌کنید

راهنمای برنامه نویسان برای آماده سازی اپلیکیشن های جنگو برای پروداکشن