django-xadmin的使用(比官方文档更精简)

01-下载源码

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

  1.  

    # 安装xadmin

  2.  

  3.  

    由于使用的是Django2.0的版本,所以需要安装xadmin项目django2分支的代码。

  4.  

    在PyCharm里打开命令行工具,输入以下命令完成安装:

  5.  

    pip install git+git://github.com/sshwsfc/[email protected]

  6.  

  7.  

    也可以使用https的地址安装,命令如下:

  8.  

    pip install git+https://github.com/sshwsfc/[email protected]

02-配置settings.py

  1.  

    # 引入下面三个app

  2.  

    INSTALLED_APPS = [

  3.  

    ....

  4.  

    ‘xadmin‘,

  5.  

    ‘crispy_forms‘,

  6.  

    ‘reversion‘,

  7.  

    ]

  8.  

  9.  

    # 修改使用中文界面

  10.  

    LANGUAGE_CODE = ‘zh-Hans‘

  11.  

  12.  

    # 修改时区

  13.  

    TIME_ZONE = ‘Asia/Shanghai‘

  14.  

  15.  

    ALLOWED_HOSTS = [‘*‘, ]

03-配置路由

  1.  

    # urls.py

  2.  

  3.  

    # -*- coding: utf-8 -*-

  4.  

    # from django.conf.urls import include, url

  5.  

    from django.urls import include, path

  6.  

  7.  

    # Uncomment the next two lines to enable the admin:

  8.  

    import xadmin

  9.  

    xadmin.autodiscover()

  10.  

  11.  

    # version模块自动注册需要版本控制的 Model

  12.  

    from xadmin.plugins import xversion

  13.  

    xversion.register_models()

  14.  

  15.  

    from django.contrib import admin

  16.  

  17.  

    urlpatterns = [

  18.  

    path(r‘xadmin/‘, xadmin.site.urls)

  19.  

    ]

04-创建数据库

python manage.py makemigrations

python manage.py migrate

05-创建超级用户

python manage.py createsuperuser

06-拉取静态文件到本地

python manage.py collectstatic

07-站点Model管理

  1.  

    xadmin 可以使用的页面样式控制基本与Django原生的admin一直。

  2.  

  3.  

    list_display 列表展示的字段

  4.  

  5.  

    preserve_filters 默认情况下,当你对目标进行创建、编辑或删除操作后,页面会依然保持原来的过滤状态。将preserve_filters设为False后,则会返回未过滤状态。

  6.  

  7.  

    prepopulated_fields 设置预填充字段。不接收DateTimeField、ForeignKey和ManyToManyField类型的字段。

  8.  

  9.  

    view_on_site 这个属性可以控制是否在admin页面显示“View site”的链接。这个链接主要用于跳转到你指定的URL页面。

  10.  

  11.  

    free_query_filter 属性: 默认为 True , 指定是否可以自由搜索. 如果开启自由搜索, 用户可以通过 url 参数来进行特定的搜索,

  12.  

    search_fields 可以通过搜索框搜索的字段名称,xadmin使用的是 模糊查询,存在外键 同 list_filter 一样 注意:只能包括 字符类型,不能有 非字符类型 如:SBBH-20180515-0002

  13.  

    list_filter 可以进行过滤操作的列,例如:存在外键字段class ---》student__class 获取值

  14.  

  15.  

    ordering 默认排序的字段

  16.  

    readonly_fields 在编辑页面的只读字段

  17.  

    exclude 在编辑页面隐藏的字段

  18.  

    list_editable 在列表页可以快速直接编辑的字段

  19.  

    show_detail_fileds 在列表页显示详情信息

  20.  

    refresh_times 指定列表页的数据定时刷新 例如:refresh_times=(3,5)

  21.  

    list_export 控制列表页导出数据的类型

  22.  

    show_bookmarks 控制是否显示书签功能

  23.  

    data_charts 控制显示图标的样式

  24.  

    model_icon 配置表的图标,可以在 awesome 上下载最新的font-awesome.css 替换,并寻找相应的icon书写

  25.  

    fieldsets ,详细页面时,使用fieldsets标签对数据进行分割显示

  26.  

    empty_value_display = "列数据为空时,显示默认值"

  27.  

    # 列聚合,可用的值:"count","min","max","avg", "sum"

  28.  

    aggregate_fields = {"expire": "max"}

  29.  

  30.  

    # 显示还原按钮,删除修改的信息可以还原

  31.  

    reversion_enable = True

  32.  

  33.  

    # 添加数据时候,一步一步提供数据

  34.  

    wizard_form_list = [

  35.  

    ("基础信息", ("name", "contact", "telphone", "address")),

  36.  

    ("其它信息", ("customer_id", "expire", "description")),

  37.  

    ]

  38.  

  39.  

    fields 表单显示内容, 不包含在内的字段不能编辑

  40.  

    filter_horizontal 从‘多选框’的形式改变为‘过滤器’的方式,水平排列过滤器,必须是一个 ManyToManyField类型,且不能用于 ForeignKey字段,默认地,管理工具使用下拉框 来展现外键 字段

  41.  

  42.  

    raw_id_fields 将ForeignKey字段从‘下拉框’改变为‘文本框’显示

  43.  

  44.  

    relfield_style 后台自定义不是下拉选择框,而是搜索框(解决了为什么用户不是下拉框的问题。。) relfield_style = ‘fk-ajax‘

  45.  

    exclude 在编辑和查看列表时指定不显示的字段

  46.  

    list_editable 列表显示的时候,指定的字段可以直接页面一键编辑

  47.  

    list_display_links 设置默认可编辑字段

  48.  

    list_per_page = 20 每页显示20个

  49.  

    actions = (‘ocr_action‘, ‘excel_action‘, ‘auto_excel_action‘) 在类中自定义的函数方法

  50.  

    auto_excel_action.short_description=‘自动化导入数据文件‘ 函数名描述

  51.  

  52.  

    object_list_template = "test.html" 自定义页面

  53.  

  54.  

    data_charts 图表,该属性为dict类型,key为图表的标示名称,value为图表的具体设置属性

  55.  

    data_charts = {

  56.  

    "user_count": {‘title‘: u"约运动",

  57.  

    "x-field": "sport_time",

  58.  

    "y-field": ("people_nums",),

  59.  

    },

  60.  

    }

  61.  

  62.  

    图表属性:

  63.  

  64.  

      title : 图表的显示名称

  65.  

      x-field : 图表的 X 轴数据列, 一般是日期, 时间等

  66.  

      y-field : 图表的 Y 轴数据列, 该项是一个 list, 可以同时设定多个列, 这样多个列的数据会在同一个图表中显示

  67.  

      order : 排序信息, 如果不写则使用数据列表的排序

  68.  

  69.  

    # 导出类型

  70.  

    list_export = (‘xls‘, ‘xml‘, ‘json‘) list_export设置为None来禁用数据导出功能

  71.  

    #导出字段

  72.  

    list_export_fields = (‘start_people‘, ‘sport‘, ‘sport_time‘)

08-站点的全局配置

  1.  

    # settingx/adminx.py

  2.  

  3.  

    import xadmin

  4.  

    from xadmin import viewsclass

  5.  

    BaseSetting(object):

  6.  

    """xadmin的基本配置"""

  7.  

    enable_themes = True # 开启主题切换功能

  8.  

    use_bootswatch = True # 支持切换主题

  9.  

  10.  

    xadmin.site.register(views.BaseAdminView, BaseSetting)

  11.  

  12.  

    class GlobalSettings(object):

  13.  

    """xadmin的全局配置"""

  14.  

    site_title = "xxx后台管理系统" # 设置站点标题

  15.  

    site_footer = "xxxxxxx" # 设置站点的页脚

  16.  

    menu_style = "accordion" # 设置菜单折叠,在左侧,默认的

  17.  

    # 设置models的全局图标, UserProfile, Sports 为表名

  18.  

    global_search_models = [UserProfile, Sports]

  19.  

    global_models_icon = {

  20.  

    UserProfile: "glyphicon glyphicon-user", Sports: "fa fa-cloud"

  21.  

  22.  

    xadmin.site.register(views.CommAdminView, GlobalSettings)

09-app名称的修改

  1.  

    # app名为users下的apps.py

  2.  

  3.  

    from django.apps import AppConfig

  4.  

  5.  

  6.  

    class UsersConfig(AppConfig):

  7.  

    # 设置app图标

  8.  

    app_icon = ‘fa fa-line-chart‘

  9.  

    # app名

  10.  

    name = ‘users‘

  11.  

    verbose_name = u‘用户管理‘

  12.  

  13.  

    # __init__.py

  14.  

  15.  

    default_app_config=‘users.apps.UsersConfig‘

10-自定义导航菜单顺序

  1.  

    from xadmin import views

  2.  

  3.  

    class GlobalSetting(object):

  4.  

    def get_site_menu(self):

  5.  

    return (

  6.  

    {‘title‘: ‘课程管理‘, ‘menus‘: (

  7.  

    {‘title‘: ‘课程信息‘, ‘url‘: self.get_model_url(Course, ‘changelist‘)},

  8.  

    {‘title‘: ‘章节信息‘, ‘url‘: self.get_model_url(Lesson, ‘changelist‘)},

  9.  

    {‘title‘: ‘视频信息‘, ‘url‘: self.get_model_url(Video, ‘changelist‘)},

  10.  

    {‘title‘: ‘课程资源‘, ‘url‘: self.get_model_url(CourseResource, ‘changelist‘)},

  11.  

    {‘title‘: ‘课程评论‘, ‘url‘: self.get_model_url(CourseComments, ‘changelist‘)},

  12.  

    )},

  13.  

    {‘title‘: ‘机构管理‘, ‘menus‘: (

  14.  

    {‘title‘: ‘所在城市‘, ‘url‘: self.get_model_url(CityDict, ‘changelist‘)},

  15.  

    {‘title‘: ‘机构讲师‘, ‘url‘: self.get_model_url(Teacher, ‘changelist‘)},

  16.  

    {‘title‘: ‘机构信息‘, ‘url‘: self.get_model_url(CourseOrg, ‘changelist‘)},

  17.  

    )},

  18.  

    {‘title‘: ‘用户管理‘, ‘menus‘: (

  19.  

    {‘title‘: ‘用户信息‘, ‘url‘: self.get_model_url(UserProfile, ‘changelist‘)},

  20.  

    {‘title‘: ‘用户验证‘, ‘url‘: self.get_model_url(EmailVerifyRecord, ‘changelist‘)},

  21.  

    {‘title‘: ‘用户课程‘, ‘url‘: self.get_model_url(UserCourse, ‘changelist‘)},

  22.  

    {‘title‘: ‘用户收藏‘, ‘url‘: self.get_model_url(UserFavorite, ‘changelist‘)},

  23.  

    {‘title‘: ‘用户消息‘, ‘url‘: self.get_model_url(UserMessage, ‘changelist‘)},

  24.  

    )},

  25.  

    {‘title‘: ‘系统管理‘, ‘menus‘: (

  26.  

    {‘title‘: ‘用户咨询‘, ‘url‘: self.get_model_url(UserAsk, ‘changelist‘)},

  27.  

    {‘title‘: ‘首页轮播‘, ‘url‘: self.get_model_url(Banner, ‘changelist‘)},

  28.  

    {‘title‘: ‘用户分组‘, ‘url‘: self.get_model_url(Group, ‘changelist‘)},

  29.  

    {‘title‘: ‘用户权限‘, ‘url‘: self.get_model_url(Permission, ‘changelist‘)},

  30.  

    {‘title‘: ‘日志记录‘, ‘url‘: self.get_model_url(Log, ‘changelist‘)},

  31.  

    )},

  32.  

  33.  

    xadmin.site.register(views.CommAdminView, GlobalSetting)

11-设置只读字段

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

  1.  

    class UserInfoAdmin():

  2.  

  3.  

    def get_readonly_fields(self, **kwargs):

  4.  

    """ 重新定义此函数,限制普通用户所能修改的字段 """

  5.  

    print(self.org_obj)

  6.  

    if self.user.is_superuser:

  7.  

    self.readonly_fields = []

  8.  

    return self.readonly_fields

  9.  

  10.  

    readonly_fields = (‘user_email‘,)

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

  1.  

    list_display = [‘get_chapter_num‘]

  2.  

  3.  

    # 需要在自定义的函数下加上如下内容

  4.  

    def get_chapter_num(self):

  5.  

    return self.chapter_set.all().count()

  6.  

    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.  

    from xadmin.layout import Main,Fieldset,Row,Side

  2.  

    def get_form_layout(self):

  3.  

    if self.org_obj:

  4.  

    self.form_layout = (

  5.  

    Main(

  6.  

    Fieldset(‘‘,

  7.  

    ‘username‘, ‘password‘,

  8.  

    css_class=‘unsort no_title‘

  9.  

    ),

  10.  

    Fieldset(_(‘Personal info‘),

  11.  

    Row(‘first_name‘, ‘last_name‘), # 显示在一行

  12.  

    ‘email‘

  13.  

    ),

  14.  

    Fieldset(_(‘Permissions‘),

  15.  

    ‘groups‘, ‘user_permissions‘

  16.  

    ),

  17.  

    Fieldset(_(‘Important dates‘),

  18.  

    ‘last_login‘, ‘date_joined‘

  19.  

    ),

  20.  

    ),

  21.  

    Side(

  22.  

    Fieldset(_(‘Status‘),

  23.  

    ‘is_active‘, ‘is_staff‘, ‘is_superuser‘,

  24.  

    ),

  25.  

    )

  26.  

  27.  

    )

  28.  

    return super(UserAdmin, self).get_form_layout()子主题

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

  1.  

    class Course(models.Model):

  2.  

    pass

  3.  

  4.  

    class BannerCourse(Course): # 继承 父类 course

  5.  

    class Meta:

  6.  

    verbose_name = ‘轮播课程‘

  7.  

    verbose_name_plural = verbose_name

  8.  

    proxy = True # 不会生成新的表

  9.  

  10.  

    # 注册新的表

  11.  

  12.  

    class CourseSourceAdmin(object):

  13.  

    list_display = [‘course‘, ‘name‘, ‘add_time‘, ‘download‘]

  14.  

    list_filter = [‘course‘, ‘name‘, ‘add_time‘, ‘download‘]

  15.  

    search_fields = [‘course‘, ‘name‘, ‘download‘]

  16.  

  17.  

    def queryset(self):

  18.  

    qs = super(CourseAdmin, self).queryset()

  19.  

  20.  

    qs = qs.filter(is_banner=False)

  21.  

    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.  

    class UserInfoAdmin(object):

  2.  

    list_display = [‘auth‘, ‘name‘, ‘depart‘, ‘email‘, ‘username‘]

  3.  

    list_filter = [‘auth‘, ‘name‘, ‘depart‘, ‘email‘, ‘username‘]

  4.  

    search_fields = [‘auth‘, ‘name‘, ‘depart‘, ‘email‘, ‘username‘]

  5.  

    list_editable = [‘auth‘, ‘name‘, ‘depart‘, ‘email‘, ‘username‘]

  6.  

    list_display_links = [‘auth‘, ‘name‘, ‘depart‘, ‘email‘, ‘username‘]

  7.  

    model_icon = ‘fa fa-user-circle-o‘

  8.  

  9.  

    from django.contrib.auth import get_user_model # 获取当前的user_model

  10.  

    xadmin.site.unregister(get_user_model()) # 注销 user

  11.  

    xadmin.site.register(UserInfo,UserInfoAdmin) # 注册新的 user

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

  1.  

    import xadmin

  2.  

    # Register your models here.

  3.  

  4.  

    from .models import User

  5.  

    from xadmin.plugins import auth

  6.  

  7.  

  8.  

    class UserAdmin(auth.UserAdmin):

  9.  

    list_display = [‘id‘, ‘username‘, ‘mobile‘, ‘email‘, ‘date_joined‘]

  10.  

    readonly_fields = [‘last_login‘, ‘date_joined‘]

  11.  

    search_fields = (‘username‘, ‘first_name‘, ‘last_name‘, ‘email‘, ‘mobile‘)

  12.  

    style_fields = {‘user_permissions‘: ‘m2m_transfer‘, ‘groups‘: ‘m2m_transfer‘}

  13.  

  14.  

    # 表单根据用户显示不同的字段内容

  15.  

    def get_model_form(self, **kwargs):

  16.  

    if self.org_obj is None:

  17.  

    self.fields = [‘username‘, ‘mobile‘, ‘is_staff‘]

  18.  

  19.  

    return super().get_model_form(**kwargs)

  20.  

  21.  

  22.  

    xadmin.site.unregister(User)

  23.  

    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.  

    class DeviceAdmin(admin.ModelAdmin):

  2.  

    ...

  3.  

    fieldsets = (

  4.  

    (None, {

  5.  

    ‘fields‘: (‘site‘, ‘device_name‘, ‘device_id‘, ‘device_type‘, ‘account‘, ‘password‘)

  6.  

    }),

  7.  

    (‘其它‘, {

  8.  

    ‘fields‘: (‘responsible_by‘, ‘device_ip‘, ‘device_model‘, ‘sn_number‘, ‘supplier‘, ‘buy_date‘, ‘expire_date‘, ‘note‘, ‘attachment‘, ‘date‘),

  9.  

    }),

  10.  

    )

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

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

  1.  

    class DeviceAdmin(object):

  2.  

    ...

  3.  

    form_layout = (

  4.  

    Main(

  5.  

    Fieldset(‘基础信息‘,

  6.  

    ‘site‘, ‘device_name‘, ‘device_id‘, ‘device_type‘, ‘account‘, ‘password‘),

  7.  

    Fieldset(‘EXTRA‘,

  8.  

    ‘device_model‘, ‘supplier‘, ‘responsible_by‘, ‘device_ip‘, ‘sn_number‘),

  9.  

    ),

  10.  

    Side(

  11.  

    Fieldset(‘其它‘,

  12.  

    ‘buy_date‘, ‘expire_date‘, ‘note‘, ‘attachment‘, ‘date‘),

  13.  

    )

  14.  

    )

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.  

    class DeviceAdmin(object):

  2.  

    ...

  3.  

    def save_models(self):

  4.  

       obj = self.new_obj

  5.  

    self.new_obj.area_company = Group.objects.get(user=self.request.user)

  6.  

    super().save_models()

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

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

  1.  

    class DeviceAdmin(object):

  2.  

    ...

  3.  

    def queryset(self):

  4.  

    """函数作用:使当前登录的用户只能看到自己负责的设备"""

  5.  

    qs = super(DeviceAdmin, self).queryset()

  6.  

    if self.request.user.is_superuser:

  7.  

    return qs

  8.  

    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.  

    class DeviceAdmin(admin.ModelAdmin):

  2.  

    ...

  3.  

    def formfield_for_foreignkey(self, db_field, request, **kwargs):

  4.  

    if not self.request.user.is_superuser: # 非superuser进行过滤,superuser可以看到全部

  5.  

    if db_field.name == "site":

  6.  

    kwargs["queryset"] = Site.objects.filter(area_company=Group.objects.get(user=self.request.user))

  7.  

    return super(DeviceAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

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

  1.  

    class DeviceAdmin(object):

  2.  

    ...

  3.  

    def formfield_for_dbfield(self, db_field, **kwargs):

  4.  

    if not self.request.user.is_superuser:

  5.  

    if db_field.name == "site":

  6.  

    kwargs["queryset"] = Site.objects.filter(area_company=Group.objects.get(user=self.request.user))

  7.  

    return super(DeviceAdmin, self).formfield_for_dbfield(db_field, **kwargs)

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

  1.  

    def save_models(self):

  2.  

    # 新的对象

  3.  

    obj = self.new_obj

  4.  

    # 可以在这里面写些逻辑

  5.  

    # 保存该对象

  6.  

    obj.save()

  7.  

  8.  

    def delete_model(self):

  9.  

    # 删除数据对象

  10.  

    obj = self.obj

  11.  

    # 相应的操作

  12.  

    obj.delete()

27-定制HTML模板

  1.  

    add_form_template = None

  2.  

    change_form_template = None

  3.  

    change_list_template = None

  4.  

    delete_confirmation_template = None

  5.  

    delete_selected_confirmation_template = None

  6.  

    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.  

    1. 首先要创建一个 Action 类, 该类需要继承 BaseActionView. BaseActionView 是 ModelAdminView 的子类:

  2.  

  3.  

    from xadmin.plugins.actions import BaseActionView

  4.  

  5.  

    class MyAction(BaseActionView):

  6.  

  7.  

    # 这里需要填写三个属性

  8.  

    action_name = "my_action" #: 相当于这个 Action 的唯一标示, 尽量用比较针对性的名字

  9.  

    description = _(u‘Test selected %(verbose_name_plural)s‘) #: 描述, 出现在 Action 菜单中, 可以使用 ``%(verbose_name_plural)s`` 代替 Model 的名字.

  10.  

  11.  

    model_perm = ‘change‘ #: 该 Action 所需权限

  12.  

  13.  

    # 而后实现 do_action 方法

  14.  

    def do_action(self, queryset):

  15.  

    # queryset 是包含了已经选择的数据的 queryset

  16.  

    for obj in queryset:

  17.  

    # obj 的操作

  18.  

    ...

  19.  

    # 返回 HttpResponse

  20.  

    return HttpResponse(...)

  21.  

    2. 然后在 Model 的 OptionClass 中使用这个 Action:

  22.  

  23.  

    class MyModelAdmin(object):

  24.  

  25.  

    actions = [MyAction, ]

  26.  

    3. 这样就完成了自己的 Action。

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

  1.  

    from django.db import models

  2.  

    from django.contrib import admin

  3.  

  4.  

    class Person(models.Model):

  5.  

    first_name = models.CharField(max_length=50)

  6.  

    birthday = models.DateField()

  7.  

  8.  

    def born_in_fifties(self):

  9.  

    return self.birthday.strftime(‘%Y‘)[:3] == ‘195‘

  10.  

    # 关键在这里

  11.  

    born_in_fifties.boolean = True

  12.  

  13.  

    class PersonAdmin(admin.ModelAdmin):

  14.  

    # 官方文档这里有错,将‘name‘改为‘first_name‘

  15.  

    list_display = (‘first_name‘, ‘born_in_fifties‘)

32-屏蔽界面的添加按钮

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

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

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

  1.  

    from django.db import models

  2.  

    from django.contrib import admin

  3.  

    from django.utils.html import format_html

  4.  

  5.  

    class Person(models.Model):

  6.  

    first_name = models.CharField(max_length=50)

  7.  

    last_name = models.CharField(max_length=50)

  8.  

    color_code = models.CharField(max_length=6)

  9.  

  10.  

    def colored_name(self):

  11.  

    return format_html(

  12.  

    ‘<span style="color: #{};">{} {}</span>‘,

  13.  

    self.color_code,

  14.  

    self.first_name,

  15.  

    self.last_name,

  16.  

    )

  17.  

  18.  

    class PersonAdmin(admin.ModelAdmin):

  19.  

    list_display = (‘first_name‘, ‘last_name‘, ‘colored_name‘)

35-菜单分组管理

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

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

  1.  

    # models.py

  2.  

  3.  

    class Course(models.Model):

  4.  

    .

  5.  

    .

  6.  

    .

  7.  

    def go_to(self):

  8.  

    from django.utils.safestring import mark_safe

  9.  

    #mark_safe后就不会转义

  10.  

    return mark_safe("<a href=‘https://home.cnblogs.com/u/derek1184405959/‘>跳转</a>")

  11.  

    go_to.short_description = "跳转"

  12.  

  13.  

  14.  

    # adminx.py

  15.  

  16.  

    class CourseAdmin(object):

  17.  

    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 外键显示含有英文,怎么把英文去掉?

  1.  

    # xadmin/plugins/filters.py

  2.  

  3.  

    # 在这个文件里,第126行

  4.  

    # if len(field_parts) > 1:

  5.  

    # # Add related model name to title

  6.  

    # spec.title = "%s %s" % (field_parts[-2].name, spec.title)

  7.  

  8.  

    # 注释掉!

45. 添加自定义的URL

https://www.cnblogs.com/fangsheng/p/9783245.html

46.xadmin多个model的数据渲染在统一个template中

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

原文地址:https://www.cnblogs.com/skbarcode/p/12569271.html

时间: 2024-10-08 11:55:24

django-xadmin的使用(比官方文档更精简)的相关文章

比官方文档更易懂的Vue.js教程!包你学会!

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由蔡述雄发表于云+社区专栏 蔡述雄,现腾讯用户体验设计部QQ空间高级UI工程师.智图图片优化系统首席工程师,曾参与<众妙之门>书籍的翻译工作.目前专注前端图片优化与新技术的探研. 2016年,乃至接下来整个2017年,如果你要问前端技术框架什么最火,那无疑就是前端三巨头:React.Angular.Vue.没错,什么jQuery,seaJs,gulp等都逐渐脱离了热点.面试的时候不吹上一点新技术,好像自己就不是搞前端的似的.当然,

Django官方文档学习

Django 1.10官方文档:https://docs.djangoproject.com/en/1.10/intro/tutorial01/ 1.查看django版本 python -m django --version 2.创建项目 django-admin startproject mysite 3.调试工程 python manage.py runserver [8080/0.0.0.0:8000] 4.创建APP python manage.py startapp polls 5.编

Django 1.9.6 官方文档 第二部分(中文翻译)

注:最近开始学习Python的Django框架,为了督促学习,强迫自己翻译官方的文档,既是一种学习,也是一种积累!由于经验不足,错误肯定不少,请大家不吝指教!原创内容,转载请注明出处. Django官方文档 第二部分:新手入门 (之所以从第二部分开始,是因为第一部分是整个官方文档结构图和导引,有空我会翻译出来补全.) 2.1 Django概述 Django诞生于快节奏的新闻编辑室环境,它被设计成快速.简单的通用网站开发工具. 本文档的目的是让你获得足够的基础知识去理解Django是如何工作的,它

Django 2.0官方文档中文 渣翻 总索引(个人学习,欢迎指正)

Django 2.0官方文档中文 渣翻 总索引(个人学习,欢迎指正) 置顶 2017年12月08日 11:19:11 阅读数:20277 官方原文: https://docs.djangoproject.com/en/2.0/ 当前翻译版本: v2.0 Python版本要求: v3.4+ (译者注:本人目前在南京一家互联网公司工作,职位是测试开发工程师.因为测试工作中经常会用到编码语言,如Python.Java.Shell等,所以几年前萌生了对Python语法的学习.Django作为Python

Jinja2学习笔记暨官方文档的翻译

http://blog.csdn.net/lgg201/article/details/4647471 呵呵, 刚刚看完Python模板引擎Jinja2的文档, 感觉很好, 觉得动态语言真是很好.  模板引擎竟然可以做的如此灵活....真是不错.... 下面直接把看文档过程的笔记发布出来, 呵呵, 基本上就是翻译, 加了不多的一点自己的解释......希望可以帮到大家 补充: 1. 在模板中设置自定义变量: {% set variable_name = value %} 比如设置{% set u

Spring Cloud官方文档中文版-服务发现:Eureka服务端

官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR3/#spring-cloud-eureka-server 文中例子我做了一些测试在:http://git.oschina.net/dreamingodd/spring-cloud-preparation Service Discovery: Eureka Server 服务发现:Eureka服务端 How to Include Eureka Server 如何创建Eurek

Android Studio官方文档之构建和运行你的APP

Android Studio官方文档之构建和运行你的APP 本文由MTJH翻译,jkYishon审校. 前言 默认情况下,Android Studio设置新的项目并且部署到模拟器或者真机设备上,只需要点击几下.使用即时运行,你并不需要构建一个新的APK即可将改变后的方法和现有的应用资源应用到一个正在运行的应用程序中,所以代码的改变是即时可见的. 点击Run来构建并运行你的APP.Android Studio通过Gradle构建你的App,选择一个部署的设备(模拟器或连接的设备),然后把你的APP

Spring Cloud官方文档中文版-声明式Rest客户端:Feign

官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#spring-cloud-feign 文中例子我做了一些测试在:http://git.oschina.net/dreamingodd/spring-cloud-preparation Declarative REST Client: Feign 声明式Rest客户端:Feign Feign is a declarative web service client. It

【苦读官方文档】2.Android应用程序基本原理概述

官方文档原文地址 应用程序原理 Android应用程序是通过Java编程语言来写.Android软件开发工具把你的代码和其它数据.资源文件一起编译.打包成一个APK文件,这个文档以.apk为后缀,保存了一个Android应用程序全部的内容.Android设备通过它来安装相应的应用. 一旦安装到设备上.每一个Android应用程序就执行在各自独立的安全沙盒中: Android系统是一个多用户的Linux系统.每一个应用都是一个用户. Android系统默认会给每一个应用分配一个唯一的用户ID(这个