• Django xadmin 学习转载


    转载地址: https://blog.csdn.net/bocai_xiaodaidai/article/details/94395604

    01-下载源码

    GitHub地址:https://github.com/sshwsfc/xadmin

    1.  
       
    2.  
      # 安装xadmin
    3.  
       
    4.  
      由于使用的是Django2.0的版本,所以需要安装xadmin项目django2分支的代码。
    5.  
      在PyCharm里打开命令行工具,输入以下命令完成安装:
    6.  
      pip install git+git://github.com/sshwsfc/xadmin.git@django2
    7.  
       
    8.  
      也可以使用https的地址安装,命令如下:
    9.  
      pip install git+https://github.com/sshwsfc/xadmin.git@django2

    02-配置settings.py

    1.  
       
    2.  
      # 引入下面三个app
    3.  
      INSTALLED_APPS = [
    4.  
      ....
    5.  
      'xadmin',
    6.  
      'crispy_forms',
    7.  
      'reversion',
    8.  
      ]
    9.  
       
    10.  
      # 修改使用中文界面
    11.  
      LANGUAGE_CODE = 'zh-Hans'
    12.  
       
    13.  
      # 修改时区
    14.  
      TIME_ZONE = 'Asia/Shanghai'
    15.  
       
    16.  
      ALLOWED_HOSTS = ['*', ]

    03-配置路由

    1.  
       
    2.  
      # urls.py
    3.  
       
    4.  
      # -*- coding: utf-8 -*-
    5.  
      # from django.conf.urls import include, url
    6.  
      from django.urls import include, path
    7.  
       
    8.  
      # Uncomment the next two lines to enable the admin:
    9.  
      import xadmin
    10.  
      xadmin.autodiscover()
    11.  
       
    12.  
      # version模块自动注册需要版本控制的 Model
    13.  
      from xadmin.plugins import xversion
    14.  
      xversion.register_models()
    15.  
       
    16.  
      from django.contrib import admin
    17.  
       
    18.  
      urlpatterns = [
    19.  
      path(r'xadmin/', xadmin.site.urls)
    20.  
      ]

    04-创建数据库

    python manage.py makemigrations
    
    python manage.py migrate

    05-创建超级用户

    python manage.py createsuperuser

    06-拉取静态文件到本地

    python manage.py collectstatic

     07-站点Model管理

    1.  
       
    2.  
      xadmin 可以使用的页面样式控制基本与Django原生的admin一直。
    3.  
       
    4.  
      list_display 列表展示的字段
    5.  
       
    6.  
      preserve_filters 默认情况下,当你对目标进行创建、编辑或删除操作后,页面会依然保持原来的过滤状态。将preserve_filters设为False后,则会返回未过滤状态。
    7.  
       
    8.  
      prepopulated_fields 设置预填充字段。不接收DateTimeField、ForeignKey和ManyToManyField类型的字段。
    9.  
       
    10.  
      view_on_site 这个属性可以控制是否在admin页面显示“View site”的链接。这个链接主要用于跳转到你指定的URL页面。
    11.  
       
    12.  
      free_query_filter 属性: 默认为 True , 指定是否可以自由搜索. 如果开启自由搜索, 用户可以通过 url 参数来进行特定的搜索,
    13.  
      search_fields 可以通过搜索框搜索的字段名称,xadmin使用的是 模糊查询,存在外键 同 list_filter 一样 注意:只能包括 字符类型,不能有 非字符类型 如:SBBH-20180515-0002
    14.  
      list_filter 可以进行过滤操作的列,例如:存在外键字段class ---》student__class 获取值
    15.  
       
    16.  
      ordering 默认排序的字段
    17.  
      readonly_fields 在编辑页面的只读字段
    18.  
      exclude 在编辑页面隐藏的字段
    19.  
      list_editable 在列表页可以快速直接编辑的字段
    20.  
      show_detail_fileds 在列表页显示详情信息
    21.  
      refresh_times 指定列表页的数据定时刷新 例如:refresh_times=(3,5)
    22.  
      list_export 控制列表页导出数据的类型
    23.  
      show_bookmarks 控制是否显示书签功能
    24.  
      data_charts 控制显示图标的样式
    25.  
      model_icon 配置表的图标,可以在 awesome 上下载最新的font-awesome.css 替换,并寻找相应的icon书写
    26.  
      fieldsets ,详细页面时,使用fieldsets标签对数据进行分割显示
    27.  
      empty_value_display = "列数据为空时,显示默认值"
    28.  
      # 列聚合,可用的值:"count","min","max","avg", "sum"
    29.  
      aggregate_fields = {"expire": "max"}
    30.  
       
    31.  
      # 显示还原按钮,删除修改的信息可以还原
    32.  
      reversion_enable = True
    33.  
       
    34.  
      # 添加数据时候,一步一步提供数据
    35.  
      wizard_form_list = [
    36.  
      ("基础信息", ("name", "contact", "telphone", "address")),
    37.  
      ("其它信息", ("customer_id", "expire", "description")),
    38.  
      ]
    39.  
       
    40.  
      fields 表单显示内容, 不包含在内的字段不能编辑
    41.  
      filter_horizontal 从‘多选框’的形式改变为‘过滤器’的方式,水平排列过滤器,必须是一个 ManyToManyField类型,且不能用于 ForeignKey字段,默认地,管理工具使用下拉框 来展现外键 字段
    42.  
       
    43.  
      raw_id_fields 将ForeignKey字段从‘下拉框’改变为‘文本框’显示
    44.  
       
    45.  
      relfield_style 后台自定义不是下拉选择框,而是搜索框(解决了为什么用户不是下拉框的问题。。) relfield_style = 'fk-ajax'
    46.  
      exclude 在编辑和查看列表时指定不显示的字段
    47.  
      list_editable 列表显示的时候,指定的字段可以直接页面一键编辑
    48.  
      list_display_links 设置默认可编辑字段
    49.  
      list_per_page = 20 每页显示20个
    50.  
      actions = ('ocr_action', 'excel_action', 'auto_excel_action') 在类中自定义的函数方法
    51.  
      auto_excel_action.short_description='自动化导入数据文件' 函数名描述
    52.  
       
    53.  
      object_list_template = "test.html" 自定义页面
    54.  
       
    55.  
      data_charts 图表,该属性为dict类型,key为图表的标示名称,value为图表的具体设置属性
    56.  
      data_charts = {
    57.  
      "user_count": {'title': u"约运动",
    58.  
      "x-field": "sport_time",
    59.  
      "y-field": ("people_nums",),
    60.  
      },
    61.  
      }
    62.  
       
    63.  
      图表属性:
    64.  
       
    65.  
        title : 图表的显示名称
    66.  
        x-field : 图表的 X 轴数据列, 一般是日期, 时间等
    67.  
        y-field : 图表的 Y 轴数据列, 该项是一个 list, 可以同时设定多个列, 这样多个列的数据会在同一个图表中显示
    68.  
        order : 排序信息, 如果不写则使用数据列表的排序
    69.  
       
    70.  
      # 导出类型
    71.  
      list_export = ('xls', 'xml', 'json') list_export设置为None来禁用数据导出功能
    72.  
      #导出字段
    73.  
      list_export_fields = ('start_people', 'sport', 'sport_time')

     

    08-站点的全局配置

    1.  
       
    2.  
      # settingx/adminx.py
    3.  
       
    4.  
      import xadmin
    5.  
      from xadmin import viewsclass
    6.  
      BaseSetting(object):
    7.  
      """xadmin的基本配置"""
    8.  
      enable_themes = True # 开启主题切换功能
    9.  
      use_bootswatch = True # 支持切换主题
    10.  
       
    11.  
      xadmin.site.register(views.BaseAdminView, BaseSetting)
    12.  
       
    13.  
      class GlobalSettings(object):
    14.  
      """xadmin的全局配置"""
    15.  
      site_title = "xxx后台管理系统" # 设置站点标题
    16.  
      site_footer = "xxxxxxx" # 设置站点的页脚
    17.  
      menu_style = "accordion" # 设置菜单折叠,在左侧,默认的
    18.  
      # 设置models的全局图标, UserProfile, Sports 为表名
    19.  
      global_search_models = [UserProfile, Sports]
    20.  
      global_models_icon = {
    21.  
      UserProfile: "glyphicon glyphicon-user", Sports: "fa fa-cloud"
    22.  
       
    23.  
      xadmin.site.register(views.CommAdminView, GlobalSettings)

     09-app名称的修改

    1.  
       
    2.  
      # app名为users下的apps.py
    3.  
       
    4.  
      from django.apps import AppConfig
    5.  
       
    6.  
       
    7.  
      class UsersConfig(AppConfig):
    8.  
      # 设置app图标
    9.  
      app_icon = 'fa fa-line-chart'
    10.  
      # app名
    11.  
      name = 'users'
    12.  
      verbose_name = u'用户管理'
    13.  
       
    14.  
      # __init__.py
    15.  
       
    16.  
      default_app_config='users.apps.UsersConfig'

     10-自定义导航菜单顺序

    1.  
       
    2.  
      from xadmin import views
    3.  
       
    4.  
      class GlobalSetting(object):
    5.  
      def get_site_menu(self):
    6.  
      return (
    7.  
      {'title': '课程管理', 'menus': (
    8.  
      {'title': '课程信息', 'url': self.get_model_url(Course, 'changelist')},
    9.  
      {'title': '章节信息', 'url': self.get_model_url(Lesson, 'changelist')},
    10.  
      {'title': '视频信息', 'url': self.get_model_url(Video, 'changelist')},
    11.  
      {'title': '课程资源', 'url': self.get_model_url(CourseResource, 'changelist')},
    12.  
      {'title': '课程评论', 'url': self.get_model_url(CourseComments, 'changelist')},
    13.  
      )},
    14.  
      {'title': '机构管理', 'menus': (
    15.  
      {'title': '所在城市', 'url': self.get_model_url(CityDict, 'changelist')},
    16.  
      {'title': '机构讲师', 'url': self.get_model_url(Teacher, 'changelist')},
    17.  
      {'title': '机构信息', 'url': self.get_model_url(CourseOrg, 'changelist')},
    18.  
      )},
    19.  
      {'title': '用户管理', 'menus': (
    20.  
      {'title': '用户信息', 'url': self.get_model_url(UserProfile, 'changelist')},
    21.  
      {'title': '用户验证', 'url': self.get_model_url(EmailVerifyRecord, 'changelist')},
    22.  
      {'title': '用户课程', 'url': self.get_model_url(UserCourse, 'changelist')},
    23.  
      {'title': '用户收藏', 'url': self.get_model_url(UserFavorite, 'changelist')},
    24.  
      {'title': '用户消息', 'url': self.get_model_url(UserMessage, 'changelist')},
    25.  
      )},
    26.  
      {'title': '系统管理', 'menus': (
    27.  
      {'title': '用户咨询', 'url': self.get_model_url(UserAsk, 'changelist')},
    28.  
      {'title': '首页轮播', 'url': self.get_model_url(Banner, 'changelist')},
    29.  
      {'title': '用户分组', 'url': self.get_model_url(Group, 'changelist')},
    30.  
      {'title': '用户权限', 'url': self.get_model_url(Permission, 'changelist')},
    31.  
      {'title': '日志记录', 'url': self.get_model_url(Log, 'changelist')},
    32.  
      )},
    33.  
       
    34.  
      xadmin.site.register(views.CommAdminView, GlobalSetting)

     11-设置只读字段

    在使用xadmin的时候,ModelAdmin默认只有对于model的增删改查,但是总是有些字段是不希望用户来编辑的。而 readonly_fields 设置之后不管是admin还是其他用户都会变成只读,而我们通常只是想限制普通用户。 这时我们就可以通过重写 get_readonly_fields 方法来实现对特定用户的只读显示。

    1.  
       
    2.  
      class UserInfoAdmin():
    3.  
       
    4.  
      def get_readonly_fields(self, **kwargs):
    5.  
      """ 重新定义此函数,限制普通用户所能修改的字段 """
    6.  
      print(self.org_obj)
    7.  
      if self.user.is_superuser:
    8.  
      self.readonly_fields = []
    9.  
      return self.readonly_fields
    10.  
       
    11.  
      readonly_fields = ('user_email',)

     

     12-在list_display显示自定义函数:

    1.  
       
    2.  
      list_display = ['get_chapter_num']
    3.  
       
    4.  
      # 需要在自定义的函数下加上如下内容
    5.  
      def get_chapter_num(self):
    6.  
      return self.chapter_set.all().count()
    7.  
      get_chapter_num.short_description= '章节数'

    13-设置页面跳转,需自定义函数

    1.  
      def go_to(self): # 设置列表页跳转
    2.  
      from django.utils.safestring import mark_safe
    3.  
      return mark_safe('<a href="http://www.fishc.com.cn">跳转</a>')
    4.  
      go_to.short_description = '友情链接'

    14-如果想添加数据的同时方便添加关联model:inlines 机制 同一个页面 可以添加 所有的相关信息

    1.  
      class ChapterInline:
    2.  
      model = Chapter
    3.  
      extra = 0
    4.  
       
    5.  
      在CoursesXadmin 添加 inlines = [ChapterInline]

     15-重载显示样式

    1.  
       
    2.  
      from xadmin.layout import Main,Fieldset,Row,Side
    3.  
      def get_form_layout(self):
    4.  
      if self.org_obj:
    5.  
      self.form_layout = (
    6.  
      Main(
    7.  
      Fieldset('',
    8.  
      'username', 'password',
    9.  
      css_class='unsort no_title'
    10.  
      ),
    11.  
      Fieldset(_('Personal info'),
    12.  
      Row('first_name', 'last_name'), # 显示在一行
    13.  
      'email'
    14.  
      ),
    15.  
      Fieldset(_('Permissions'),
    16.  
      'groups', 'user_permissions'
    17.  
      ),
    18.  
      Fieldset(_('Important dates'),
    19.  
      'last_login', 'date_joined'
    20.  
      ),
    21.  
      ),
    22.  
      Side(
    23.  
      Fieldset(_('Status'),
    24.  
      'is_active', 'is_staff', 'is_superuser',
    25.  
      ),
    26.  
      )
    27.  
       
    28.  
      )
    29.  
      return super(UserAdmin, self).get_form_layout()子主题

    16-model的管理器,一个model 分不同情况 管理

    1.  
       
    2.  
      class Course(models.Model):
    3.  
      pass
    4.  
       
    5.  
      class BannerCourse(Course): # 继承 父类 course
    6.  
      class Meta:
    7.  
      verbose_name = '轮播课程'
    8.  
      verbose_name_plural = verbose_name
    9.  
      proxy = True # 不会生成新的表
    10.  
       
    11.  
      # 注册新的表
    12.  
       
    13.  
      class CourseSourceAdmin(object):
    14.  
      list_display = ['course', 'name', 'add_time', 'download']
    15.  
      list_filter = ['course', 'name', 'add_time', 'download']
    16.  
      search_fields = ['course', 'name', 'download']
    17.  
       
    18.  
      def queryset(self):
    19.  
      qs = super(CourseAdmin, self).queryset()
    20.  
       
    21.  
      qs = qs.filter(is_banner=False)
    22.  
      return qs

    17-获取当前的user表model

    1.  
      from django.contrib.auth import get_user_model (获取当前的user表model)
    2.  
      User = get_user_model()
    3.  
      site.register(User,Useradmin)

    18-卸载注册的model

    1.  
      from django.contrib.auth.models import User
    2.  
       
    3.  
      xadmin.site.unregister(User)

    19-替换默认的注册 user(继承了abstractuser)

    1.  
       
    2.  
      class UserInfoAdmin(object):
    3.  
      list_display = ['auth', 'name', 'depart', 'email', 'username']
    4.  
      list_filter = ['auth', 'name', 'depart', 'email', 'username']
    5.  
      search_fields = ['auth', 'name', 'depart', 'email', 'username']
    6.  
      list_editable = ['auth', 'name', 'depart', 'email', 'username']
    7.  
      list_display_links = ['auth', 'name', 'depart', 'email', 'username']
    8.  
      model_icon = 'fa fa-user-circle-o'
    9.  
       
    10.  
      from django.contrib.auth import get_user_model # 获取当前的user_model
    11.  
      xadmin.site.unregister(get_user_model()) # 注销 user
    12.  
      xadmin.site.register(UserInfo,UserInfoAdmin) # 注册新的 user

    20-表单根据用户显示不同的字段内容  get_model_form

    1.  
       
    2.  
      import xadmin
    3.  
      # Register your models here.
    4.  
       
    5.  
      from .models import User
    6.  
      from xadmin.plugins import auth
    7.  
       
    8.  
       
    9.  
      class UserAdmin(auth.UserAdmin):
    10.  
      list_display = ['id', 'username', 'mobile', 'email', 'date_joined']
    11.  
      readonly_fields = ['last_login', 'date_joined']
    12.  
      search_fields = ('username', 'first_name', 'last_name', 'email', 'mobile')
    13.  
      style_fields = {'user_permissions': 'm2m_transfer', 'groups': 'm2m_transfer'}
    14.  
       
    15.  
      # 表单根据用户显示不同的字段内容
    16.  
      def get_model_form(self, **kwargs):
    17.  
      if self.org_obj is None:
    18.  
      self.fields = ['username', 'mobile', 'is_staff']
    19.  
       
    20.  
      return super().get_model_form(**kwargs)
    21.  
       
    22.  
       
    23.  
      xadmin.site.unregister(User)
    24.  
      xadmin.site.register(User, UserAdmin)

    而在 admin 里是 get_fields

    1.  
      # 表单根据用户显示不同的字段内容
    2.  
      def get_fields(self, request, obj=None):

    21-模型编辑页面Field分区显示--form_layout

    在admin.py中我们可以通过Fieldsets去设置字段的分块显示,例如以下代码:
    界面显示会上下分区,分为名字为空和名字为其它的两个区域。

    1.  
       
    2.  
      class DeviceAdmin(admin.ModelAdmin):
    3.  
      ...
    4.  
      fieldsets = (
    5.  
      (None, {
    6.  
      'fields': ('site', 'device_name', 'device_id', 'device_type', 'account', 'password')
    7.  
      }),
    8.  
      ('其它', {
    9.  
      'fields': ('responsible_by', 'device_ip', 'device_model', 'sn_number', 'supplier', 'buy_date', 'expire_date', 'note', 'attachment', 'date'),
    10.  
      }),
    11.  
      )

    而在xadmin.py中,这个字段不再生效,需用form_layout去设置。

    可分为Main主区域和Side侧边区域,Main或Side中又可通过Fieldset再分多个区域。Fieldset为一个元组,第一个字段为需要设置的名称,其它字段均为模型中的字段名。如下:

    1.  
       
    2.  
      class DeviceAdmin(object):
    3.  
      ...
    4.  
      form_layout = (
    5.  
      Main(
    6.  
      Fieldset('基础信息',
    7.  
      'site', 'device_name', 'device_id', 'device_type', 'account', 'password'),
    8.  
      Fieldset('EXTRA',
    9.  
      'device_model', 'supplier', 'responsible_by', 'device_ip', 'sn_number'),
    10.  
      ),
    11.  
      Side(
    12.  
      Fieldset('其它',
    13.  
      'buy_date', 'expire_date', 'note', 'attachment', 'date'),
    14.  
      )
    15.  
      )

    22-获取用户信息并填充模型字段--save_models

    有时模型中会需要记录添加数据的用户,保存在created_by这样的字段中。这时我们就需要重写save_model方法,在保存模型时存入用户的信息。

    admin.py中会sava_model,如下。

    1.  
      class DeviceAdmin(admin.ModelAdmin):
    2.  
      ...
    3.  
      def save_model(self, request, obj, form, change):
    4.  
      obj.area_company = Group.objects.get(user=request.user)
    5.  
      super().save_model(request, obj, form, change)

    而xadmin.py中改为使用save_models。

    1.  
       
    2.  
      class DeviceAdmin(object):
    3.  
      ...
    4.  
      def save_models(self):
    5.  
         obj = self.new_obj
    6.  
      self.new_obj.area_company = Group.objects.get(user=self.request.user)
    7.  
      super().save_models()

    23-根据登录用户或组过滤数据--queryset

    需要根据登录用户或组过滤数据时,admin.py中是重写get_queryset方法,xadmin.py中改为重写queryset方法即可。如下:

    1.  
       
    2.  
      class DeviceAdmin(object):
    3.  
      ...
    4.  
      def queryset(self):
    5.  
      """函数作用:使当前登录的用户只能看到自己负责的设备"""
    6.  
      qs = super(DeviceAdmin, self).queryset()
    7.  
      if self.request.user.is_superuser:
    8.  
      return qs
    9.  
      return qs.filter(area_company=Group.objects.get(user=self.request.user))

    24-外键下拉框添加过滤

    admin.py中发现将site字段添加到autocomplete_fields(autocomplete_fields作用是下拉选项会多出一个搜索框,方便搜索选择)之后,会自动进行过滤,满足上述场景要求。如果不使用autocomplete_fields,可以通过重写formfield_for_foreignkey方法去做筛选。如下:

    1.  
       
    2.  
      class DeviceAdmin(admin.ModelAdmin):
    3.  
      ...
    4.  
      def formfield_for_foreignkey(self, db_field, request, **kwargs):
    5.  
      if not self.request.user.is_superuser: # 非superuser进行过滤,superuser可以看到全部
    6.  
      if db_field.name == "site":
    7.  
      kwargs["queryset"] = Site.objects.filter(area_company=Group.objects.get(user=self.request.user))
    8.  
      return super(DeviceAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

    而xadmin.py中没有这个方法了,需要重写formfield_for_dbfield方法。如下:

    1.  
       
    2.  
      class DeviceAdmin(object):
    3.  
      ...
    4.  
      def formfield_for_dbfield(self, db_field, **kwargs):
    5.  
      if not self.request.user.is_superuser:
    6.  
      if db_field.name == "site":
    7.  
      kwargs["queryset"] = Site.objects.filter(area_company=Group.objects.get(user=self.request.user))
    8.  
      return super(DeviceAdmin, self).formfield_for_dbfield(db_field, **kwargs)

    26-django自带的admin是有save_models和delete_model的,后台修改模型类后就会执行改函数,xadmin中如下

    1.  
       
    2.  
      def save_models(self):
    3.  
      # 新的对象
    4.  
      obj = self.new_obj
    5.  
      # 可以在这里面写些逻辑
    6.  
      # 保存该对象
    7.  
      obj.save()
    8.  
       
    9.  
      def delete_model(self):
    10.  
      # 删除数据对象
    11.  
      obj = self.obj
    12.  
      # 相应的操作
    13.  
      obj.delete()

     27-定制HTML模板

    1.  
       
    2.  
      add_form_template = None
    3.  
      change_form_template = None
    4.  
      change_list_template = None
    5.  
      delete_confirmation_template = None
    6.  
      delete_selected_confirmation_template = None
    7.  
      object_history_template = None

     28-xadmin此版本貌似不能加载views.py

    作为破解在 __init__.py中增加了 import views一行,如下:

    __init__.py

    import views

     29-列表视图新增自定义按钮

     https://www.cnblogs.com/Tommy-Yu/p/5443127.html

    http://www.cnblogs.com/livingintruth/p/3738601.html

    30-自定义actions

    1.  
       
    2.  
      1. 首先要创建一个 Action 类, 该类需要继承 BaseActionView. BaseActionView 是 ModelAdminView 的子类:
    3.  
       
    4.  
      from xadmin.plugins.actions import BaseActionView
    5.  
       
    6.  
      class MyAction(BaseActionView):
    7.  
       
    8.  
      # 这里需要填写三个属性
    9.  
      action_name = "my_action" #: 相当于这个 Action 的唯一标示, 尽量用比较针对性的名字
    10.  
      description = _(u'Test selected %(verbose_name_plural)s') #: 描述, 出现在 Action 菜单中, 可以使用 ``%(verbose_name_plural)s`` 代替 Model 的名字.
    11.  
       
    12.  
      model_perm = 'change' #: 该 Action 所需权限
    13.  
       
    14.  
      # 而后实现 do_action 方法
    15.  
      def do_action(self, queryset):
    16.  
      # queryset 是包含了已经选择的数据的 queryset
    17.  
      for obj in queryset:
    18.  
      # obj 的操作
    19.  
      ...
    20.  
      # 返回 HttpResponse
    21.  
      return HttpResponse(...)
    22.  
      2. 然后在 Model 的 OptionClass 中使用这个 Action:
    23.  
       
    24.  
      class MyModelAdmin(object):
    25.  
       
    26.  
      actions = [MyAction, ]
    27.  
      3. 这样就完成了自己的 Action。

     31-给这个方法添加一个boolean的属性并赋值为True,它将显示为on/off的图标

    1.  
       
    2.  
      from django.db import models
    3.  
      from django.contrib import admin
    4.  
       
    5.  
      class Person(models.Model):
    6.  
      first_name = models.CharField(max_length=50)
    7.  
      birthday = models.DateField()
    8.  
       
    9.  
      def born_in_fifties(self):
    10.  
      return self.birthday.strftime('%Y')[:3] == '195'
    11.  
      # 关键在这里
    12.  
      born_in_fifties.boolean = True
    13.  
       
    14.  
      class PersonAdmin(admin.ModelAdmin):
    15.  
      # 官方文档这里有错,将'name'改为'first_name'
    16.  
      list_display = ('first_name', 'born_in_fifties')

     32-屏蔽界面的添加按钮

    33-xadmin列表页添加自定义工具栏toolbar

     https://blog.csdn.net/iteye_12715/article/details/82678755

    34-想对某些字段设置颜色,可用下面的设置

    1.  
       
    2.  
      from django.db import models
    3.  
      from django.contrib import admin
    4.  
      from django.utils.html import format_html
    5.  
       
    6.  
      class Person(models.Model):
    7.  
      first_name = models.CharField(max_length=50)
    8.  
      last_name = models.CharField(max_length=50)
    9.  
      color_code = models.CharField(max_length=6)
    10.  
       
    11.  
      def colored_name(self):
    12.  
      return format_html(
    13.  
      '<span style="color: #{};">{} {}</span>',
    14.  
      self.color_code,
    15.  
      self.first_name,
    16.  
      self.last_name,
    17.  
      )
    18.  
       
    19.  
      class PersonAdmin(admin.ModelAdmin):
    20.  
      list_display = ('first_name', 'last_name', 'colored_name')

     35-菜单分组管理

    https://www.cnblogs.com/fiona-zhong/p/9647986.html

     37-增加页面显示的列 ‘跳转’——显示自定义的html代码

    1.  
       
    2.  
      # models.py
    3.  
       
    4.  
      class Course(models.Model):
    5.  
      .
    6.  
      .
    7.  
      .
    8.  
      def go_to(self):
    9.  
      from django.utils.safestring import mark_safe
    10.  
      #mark_safe后就不会转义
    11.  
      return mark_safe("<a href='https://home.cnblogs.com/u/derek1184405959/'>跳转</a>")
    12.  
      go_to.short_description = "跳转"
    13.  
       
    14.  
       
    15.  
      # adminx.py
    16.  
       
    17.  
      class CourseAdmin(object):
    18.  
      list_display = ['go_to']

    效果如下:

     38-xadmin主页布局的修改

    例如:

    数据库是 MySQL,xadmin自带的两张表:xadmin_usersettings、xadmin_userwidget

    xadmin_usersettings:字段value的初始值应为 | ,代表将主页面分为两列。

    xadmin_userwidget:记录当前登录用户主页面 显示的小组件。

     xadmin/views/dashboard.py部分源码

     39-设置xadmin新用户主页的默认布局

    数据库:

    复制代码

    1.  
      # xadmin/model.py
    2.  
       
    3.  
       
    4.  
      @python_2_unicode_compatible
    5.  
      class UserSettings(models.Model):
    6.  
      user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name=_(u"user"))
    7.  
      key = models.CharField(_('Settings Key'), max_length=256)
    8.  
      value = models.TextField(_('Settings Content'))
    9.  
       
    10.  
      # 重写save方法
    11.  
      def save(self, force_insert=False, force_update=False, using=None,
    12.  
      update_fields=None):
    13.  
       
    14.  
      if not self.value:
    15.  
      self.value = "|"
    16.  
      super(UserSettings, self).save()
    17.  
      page_id = 'home'
    18.  
      default_list = [
    19.  
      [{'list': '{"title": "", "model": "auth.user"}'}, ],
    20.  
      [{'list': '{"title": "", "model": "cashflows.bank_cash_flows"}'}, ],
    21.  
      [{'html': '{"title": "Test Widget", "content": "第一次测试!!"}'}, ],
    22.  
      [{'qbutton': '{"title": "aaa"}'}, ],
    23.  
      ]
    24.  
       
    25.  
      for i in default_list:
    26.  
      user_widget = UserWidget()
    27.  
      for j in i:
    28.  
      for z in j.keys():
    29.  
      user_widget.page_id = page_id
    30.  
      user_widget.user_id = self.user_id
    31.  
      user_widget.widget_type = z
    32.  
      user_widget.value = j[z]
    33.  
      user_widget.save()
    34.  
       
    35.  
      id_list = [] # 存放user的id
    36.  
      a = UserWidget.objects.filter(user_id=self.user)
    37.  
      for i in a:
    38.  
      id_list.append(i.id)
    39.  
       
    40.  
      self.value = "%s,%s|%s,%s" % (id_list[0], id_list[1], id_list[2], id_list[3])
    41.  
       
    42.  
      UserSettings.objects.filter(user_id=self.user).value = self.value
    43.  
      super(UserSettings, self).save()
    44.  
      else:
    45.  
      super(UserSettings, self).save()

    41. admin_order_field支持查询查找以按相关模型上的值排序。此示例在列表显示中包含“作者名字”列,并允许按名字对其进行排序:

    https://docs.djangoproject.com/en/1.8/ref/contrib/admin/

     42. 获取verbose_name

    UserInfo._meta.get_field('name').verbose_name

     43. xadmin list_filter 外键显示含有英文,怎

  • 相关阅读:
    人一生最后悔五件事
    C# 实现程序只启动一次(多次运行激活第一个实例,使其获得焦点,并在最前端显示)
    socket 编程 学习2
    Linux内核源码阅读以及工具(转)
    迭代法
    C语言程序设计 C语言中的时间函数(转)
    线段的平移
    数独(sudoku)的生成与破解(转)
    PageBase,ControlBase,Base Class
    Oracle “万年虫”
  • 原文地址:https://www.cnblogs.com/oscarli/p/12469394.html
Copyright © 2020-2023  润新知