Django Xadmin配置与使用

xadmin基础配置

  1. xadmin源码放在Django项目根目录;
  2. setting.py:INSTALLED_APPS=[...,'crispy_forms','Xadmin',...]
  3. 安装xadmin依赖包:pip3 install django-crispy-forms django-import-export django-reversion django formtools future httplib2 six xlwt xlsxwriter requests
  4. 生成xadmin需要的表:python3 manage.py migrate
  5. 配置访问地址:urls.py:path('xadmin/', xadmin.site.urls)

xadmin配置列表、搜索和过滤

  1. 注册模型类:1.在应用中创建adminx.py;2.xadmin.site.register(modlename1,modlename2,...)

  2. 设置应用在后台的名称:在应用中apps.py添加verbose_name='appname'

  3. 创建模型管理器:

    class ModlenameAdmin(object):
     list_display=['colume1','colume2',...] # 显示的字段
     search_fields=['colume1','colume2',...] # 搜索的字段
     list_filter=['colume1','colume2',...] # 过滤的字段
     list_editable=['colume1','colume2',...] # 在页面中直接编辑的字段
      '''
      1.列表中可以是字段,也可以是方法名
      2.如果表中含有外键,根据外键表的某个字段过滤则可以使用'tablename__column'格式写入
      '''

xadmin全局配置

  1. 在应用/adminx.py

    class GlobalSettings(object):
        site_title = "左上角文字"
        site_footer = "页面底部文字"
        menu_style = "accordion" # 折叠左侧标题栏
    xadmin.site.register(xadmin.views.CommAdminView, GlobalSettings)
    
    class BaseSettings(object):
        enable_themes = True # 页面主题设置
        use_bootswatch = True
    xadmin.site.register(xadmin.views.BaseAdminView, BaseSettings)

xadmin进阶配置

  1. 修改编辑页面布局
    1. 参考xadmin/plugins/auth.py:def get_form_layout(self)

    2. 模型管理器中添加:

      def get_form_layout(self):
              if self.org_obj: # 判断是否是编辑页面
                  self.form_layout = (
                          Main(
                              Fieldset("讲师信息", # 块名称
                                       'teacher','course_org',
                                       css_class='unsort no_title'
                                       ),
                              Fieldset("基本信息",
                                       'name', 'desc',
                                       Row('learn_times', 'degree'), # 两个字段在一行
                                       Row('category', 'tag'),
                                       'youneed_know', 'teacher_tell', 'detail',
                                       ),
                          ),
                          # 在页面右侧显示
                          Side(
                              Fieldset("访问信息",
                                       'fav_nums', 'click_nums', 'students','add_time'
                                       ),
                          ),
                          Side(
                              Fieldset("选择信息",
                                       'is_banner', 'is_classics'
                                       ),
                          )
                  )
              return super(NewCourseAdmin, self).get_form_layout()
  2. 权限管理:批量管理用户权限----->组
  3. 根据用户权限过滤列表页数据:

    模型管理器中添加:

    def queryset(self):
            qs = super().queryset()
            # if not self.request.user.is_superuser: # 判断用户权限
            qs = qs.filter(is_banner=True)
            return qs
  4. 控制保存和修改逻辑
    1. 在模型管理器中,重载def save_models()方法

      def save_models(self):
              obj = self.new_obj # 获取编辑对象
              if not obj.id: # 判断是新增页面还是编辑页面
                  obj.save()
                  course = obj.course
                  course.students += 1
                  course.save()
    2. 在xadmin的源码中,被@filter_hook装饰的方法都可以重载,参考xadmin/views/edit.py

  5. 多个管理器管理同一张表
    1. 新建model---->class Modelone(modelname)继承被操作的模型类;

      class Modelone(Modelname): # 新的model 继承已有的模型类
          class Meta:
              verbose_name = "xxx"
              verbose_name_plural = verbose_name
              proxy = True          # 在migrate的时候不会生成新的表
    2. 创建ModelAdmin管理器,并注册

      class ModeloneAdmin(object): # 新建管理器
          pass
      
      class ModelAdmin(object): # 已有管理器
          pass
      # 注册管理器     
      xadmin.site.register(Modelone, ModeloneAdmin)
      xadmin.site.register(Model, ModelAdmin)
  6. 列表页显示图片
    1. 在模型类中添加自定方法

      def show_image(self):
              from django.utils.safestring import mark_safe
              return mark_safe("<img src='{}'>".format(self.image.url))
      show_image.short_description = "图片" # 设置方法在列表页中的显示名称

      可以用同样的方式添加其他自定义方法。

    2. 在模型管理器中,

      list_display = [...,'show_image',...] # 添加到显示列表中
  7. 配置只读字段、排除字段和默认的排序

    在模型管理器中添加以下内容

    # !!!注意:某个字段不能同时存在于只读和隐藏中
    # 只读字段
    readonly_fields=['xx','xx',....]
    # 隐藏字段
    exclude=['xx','xx',...]
    # 根据某个字段排序
    ordering=['xx','xx',...]
  8. 通过models-icon修改xadmin后台中model图标
    1. 管理器中添加 model_icon='' fa fa-xxxx" xxxx是图标的名称
    2. 参考xadmin/static/xadmin/vendor/font-awesome (第三方图表库)
    3. 下载Font Awesome 替换xadmin自带图表库
    4. 复制中文官网图标名称,修改model_icon的值
  9. inline配置多张表在同一页面编辑
    1. adminx.py

      class LessonInline(object):
        model = Lesson # 指明模型(表)
        extra = 0 # 打开页面时默认不添加数据,无标签页
        style = 'tab' # 标签页形式 最好注销不进行设置,避免出现bug
        exclude = ['',''] # 隐藏字段
    2. 在模型管理器中添加属性 inlines=[LessonInline]

  10. ueditor富文本编辑器
    1. DjangoUeditor源码放在项目根目录;

    2. 配置setting.py

      INSTALLED_APPS = [
          ...
          'DjangoUeditor',
          ...
      ]
    3. 配置urls.py

      urlpatterns = [
       ...
          #配置富文本相关的url
          url(r'^ueditor/',include('DjangoUeditor.urls' )),
      ]
    4. 在models中使用

      需要使用编辑器的字段修改为:(部分参数参考github)

      xxx = UEditorField(verbose_name="xx", width=600, height=300, imagePath="courses/ueditor/images/",
                                filePath="courses/ueditor/files/", default="")
    5. xadmin不支持ueditor,需要插件

      1. 插件拷贝---->xadmin/plugins/(使用下面内容新建ueditor.py)
      import xadmin
      from xadmin.views import BaseAdminPlugin, CreateAdminView, ModelFormAdminView, UpdateAdminView
      from DjangoUeditor.models import UEditorField
      from DjangoUeditor.widgets import UEditorWidget
      from django.conf import settings
      
      
      class XadminUEditorWidget(UEditorWidget):
          def __init__(self,**kwargs):
              self.ueditor_options=kwargs
              self.Media.js = None
              super(XadminUEditorWidget,self).__init__(kwargs)
      
      class UeditorPlugin(BaseAdminPlugin):
      
          def get_field_style(self, attrs, db_field, style, **kwargs):
              if style == 'ueditor':
                  if isinstance(db_field, UEditorField):
                      widget = db_field.formfield().widget
                      param = {}
                      param.update(widget.ueditor_settings)
                      param.update(widget.attrs)
                      return {'widget': XadminUEditorWidget(**param)}
              return attrs
      
          def block_extrahead(self, context, nodes):
              js = '<script type="text/javascript" src="%s"></script>' % (settings.STATIC_URL + "ueditor/ueditor.config.js")         #自己的静态目录
              js += '<script type="text/javascript" src="%s"></script>' % (settings.STATIC_URL + "ueditor/ueditor.all.min.js")   #自己的静态目录
              nodes.append(js)
      
      xadmin.site.register_plugin(UeditorPlugin, UpdateAdminView)
      xadmin.site.register_plugin(UeditorPlugin, CreateAdminView)
      1. /xadmin/plugins/init.py中PLUGINS中添加文件名称
    6. 在管理器中添加属性

      style_fields = {
              "columnname":"ueditor"
          }
    7. 在前端模版中显示:

      1. 因为保存时的数据结构时str,所以在html模版中需要显示字段的位置添加

        {%autoescape off%}{{columnname}}{%endautoescape%},将str转换为html代码。

  11. 数据的导入和导出配置

    与添加ueditor相同

    1. /xadmin/plugins/importexport.py
    2. /xadmin/plugins/init.py中PLUGINS中添加该文件名称,注销export,避免重复。

猜你喜欢

转载自www.cnblogs.com/blueandsky/p/11946406.html