Django之admin管理工具

发布时间:2019-05-06 22:00:08编辑:auto阅读(2495)

      一、基本设置

      1,应用注册

      若要把app应用显示在后台管理中,需要在admin.py中注册。有两种方式注册

      1.1 方式一:

    from django.contrib import admin
    from blog.models import Blog
      
    #Blog模型的管理器
    class BlogAdmin(admin.ModelAdmin):
        list_display=('id', 'caption', 'author', 'publish_time')
         
    #在admin中注册绑定
    admin.site.register(Blog, BlogAdmin)

      1.2 方式二:用装饰器

    from django.contrib import admin
    from blog.models import Blog
      
    #Blog模型的管理器
    @admin.register(Blog)
    class BlogAdmin(admin.ModelAdmin):
        list_display=('id', 'caption', 'author', 'publish_time')

      2,admin界面汉化

      默认admin后台管理界面是英文的,可以在settings.py中设置:

      LANGUAGE_CODE='zh-hans'

      TIME_ZONE='Asia/Shanghai'

      二、记录列表界面设置

      1,记录列表基本设置

    from django.contrib import admin
    from app01.models import Book
    from django.utils.safestring import mark_safe
    #Blog模型的管理器 @admin.register(Book) class BookAdmin(admin.ModelAdmin):
      def _



      def authors(self,obj):
        return ','.join([obj_author for obj_author in obj.author.all()])
    #listdisplay设置要显示在列表中的字段(id字段是Django模型的默认主键) list_display = ('name', 'publish', 'authors', 'pub_date','price') #list_per_page设置每页显示多少条记录,默认是100条 list_per_page = 50 #ordering设置默认排序字段,负号表示降序排序 ordering = ('-price',) #list_editable 设置默认可编辑字段 list_editable = ['price'] #fk_fields 设置显示外键字段 fk_fields = ('machine_room_id',)
      #设置哪些字段可以点击进入编辑界面 list_display_links = ('name', 'pub_date')
      #筛选器 list_filter =('publish', 'author', ) #过滤器 search_fields =('name', 'net', 'mark') #搜索字段 date_hierarchy = 'go_time' # 详细时间分层筛选 
      
      #链表查询是否自动select_related
      list_select_related

      #action,定制action中的操作(批量操作)
      def func(self,request,queryset):
        queryset.update(price=100)
      func.short_description='批量初始化'
      actions=[func,]

      #定制HTML模板
      add_form_template=None
      change_form_template=None
      change_list_template=None
      delete_confirmation_template=None
      delete_selected_confirmation_template=None
      object_history_template=None

       三、admin源码解读

      1,启动所有app的admin.py文件

    def autodiscover():
        autodiscover_modules('admin', register_to=site)

      2,注册模型类

    class BookAdmin(admin.ModelAdmin):      #自定义的配置类
        list_display = ("title",'publishDate', 'price')
    
    admin.site.register(Book, BookAdmin) 
    admin.site.register(Publish)

      执行register方法:

    class ModelAdmin:        #配置类
      
    pass
    class
    AdminSite: def __init__(self): self._registry = {} def register(self, model, admin_class=None, **options): admin_class = admin_class or ModelAdmin self._registry[model] = admin_class(model)
    site=AdminSite()

      注册完模型类之后,只是完成了在_registry字典里加了键值对,以模型类为键,配置类对象为值,如现在:

    得到的值:
    _registry={Book:BookAdmin(Book),Publish:ModelAdmin(Publish)}
    至此,注册环节完成

      3,admin的url配置

    urlpatterns = [
        path('admin/', admin.site.urls),
    ]
    class ModelAdmin():
        @property
        def urls(self):
            return self.get_urls(), None, None
         def get_urls(self):
            temp=[
                path('',self.list_view),
                path('add/',self.add_view),
                re_path('(\d+)/delete/',self.delete_view),
                re_path('(\d+)/edit/',self.edit_view),
            ]
            return temp
        
    class AdminSite:
        @property
        def urls(self):
            return self.get_urls(), 'admin', self.name
        def get_urls(self):
            temp=[]
            for model,config_obj in self._registry.items():
                model_name = model._meta.model_name
                app_label = model._meta.app_label
                temp.append(path('%s/%s/'%(app_label,model_name),config_obj.urls))
            return temp

      这就完成了url的二级分发

关键字