django_ simplepro 表格、列表(ModelAdmin)配置

表格和Admin

simplepro table基于elementui table,设置主要来自ModelAdmin,写法与原生admin一致,但是在原生的基础上增加了和减少了部分字段。注意目前table仅支持下列这些字段,但是在编辑和添加页还有用到其他字段,请参考原生admin与simpleui,simplepro是完全基于simpleui的。

自定义按钮

admin中的自定义actions也是支持的,也就是simpleui说说的自定义按钮。

定义方法和使用均与原生admin一致,不过simpleui在这基础上进行了扩展。可以参考自定义按钮文档

Admin字段

字段	类型	说明
list_display	tuple	table显示的字段
search_fields	tuple	搜索框搜索的字段
list_per_page	int	每页显示的数量
list_filter	array	筛选字段
list_display_links	显示连接进入编辑页的字段	
fields_options	dict	表格的表头字段设置
actions_show	boolean	显示隐藏action,默认为True,只有显式指定为False的时候才隐藏
actions	array	自定义按钮
字段互斥
list_display_links 字段与formatter方法互斥

如果有formatter方法,list_display_links中配置的字段将无任何作用。

fields_options字段

admin 中字段设置,及时list_display 未定义该字段,在这里设置了也不会出错 表头字段完全遵循elementui的table文档:

https://element.eleme.cn/#/zh-CN/component/table

fields_options支持自定义字段的值,比如model中的自定义方法 就算自定义字段

属性
目前支持以下属性

字段 类型 说明

fixed	str	固定列,取值 left 和right
sortable	boolean	排序字段,默认为'custom'
width	str	宽度,取值例如100px
min_width	str	最小宽度,取值例如100px
resizable	boolean	列是否可以调整宽度
class_name	str	列的 className
label_class_name	str	当前列标题的自定义类名
sortable字段
排序字段,默认为'custom',取值为: true, false, 'custom'

其中为custom的时候网络排序

取值为true,本地排序

自定义字段该值始终为false不排序

fields_options例子
fields_options = {
        'id': {
            'fixed': 'left',
            'width': '80px',
            'align': 'center'
        },
        'create_time': {
            'fixed': 'right',
            'width': '200px',
            'align': 'left'
        }
    }

方法
字段 类型 说明

delete_queryset	function	删除时触发该方法
formatter	function	数据格式化
get_queryset	function	获取自定义的queryset
get_list_display	function	获取自定义的list_display
get_list_filter	function	获取自定义的list_filter
get_actions	function	获取自定义的actions
get_summaries	function	获取底部统计数据
get_results	function	获取返回的结果,1.2+版本生效

formatter 方法
入参

字段	类型	说明
obj	object	当前对象
field_name	str	字段名
value	object	字段值

返回
返回参数为单元格显示的值,可以是html,可以是文本。

formatter例子

def formatter(self, obj, field_name, value):
    # 这里可以对value的值进行判断,比如日期格式化等
    return value

delete_queryset 说明
例子:

def delete_queryset(self, request, queryset):
    #这里可以做些自定义的处理
    pass

返回
如果返回的是queryset,那么程序将会调用delete方法执行删除。如果返回的是None,将不会做任何动作

get_queryset 说明
例子:

def get_queryset(self, request):
        qs = super().get_queryset(request)


        return qs.filter(id__gte=1)

注意,get_queryset可以返回为None,包括pass也是返回为None。如果为None,的时候 该queryset将会被丢弃,框架将会从model中获取queryset

qs=model.objects.get_querset()
可以利用这个方法来控制自定义的数据权限,该方法与原生admin一致。

get_list_display 说明
    def get_list_display(self, request):
        # 这里可以进行判断,动态返回某些字段或表头
        return self.list_display
get_list_filter 说明
    def get_list_filter(self, request):
        # 这里可以进行判断,动态返回list_filter
        return self.list_filter
get_actions 说明
    def get_actions(self, request):
        # 这里可以进行判断,动态返回actions
        actions = super(EmployeAdmin, self).get_actions(request)
    return actions

get_summaries 说明

在modeladmin中加入该方法后,会自动在表格底部增加一列合计列。 可以用request来控制动态显示,也可以直接使用带有搜索条件的queryset,该queryset是列表数据的深拷贝对象,不带排序和分页。

Demo1.

    # 动态统计,Simple Pro独有功能
    def get_summaries(self, request, queryset):
        # 自定义统计,可以根据request的页面 来统计当前页的数据,queryset 为深拷贝对象,如果传入的话 可能会影响列表的数据
        # 返回的数据 为数组,对应列表的每一列
        # 不支持html

        # 如果想根据人员权限来动态展示,可以直接返回不同的数组,或者返回为None,为None的时候,不显示统计列

        # 如果想统计满足当前搜索条件的数据的话 ,可以直接使用queryset.来进行统计
        if request.POST.get('current_page') == '2':
            return None
        else:
            # 需要有空字符串占位
            return ('合计', '321', '1213123', '123123', '', '', '', '测试')
Demo2.

    # 动态统计,Simple Pro独有功能
    def get_summaries(self, request, queryset):
        # 如果想统计满足当前搜索条件的数据的话 ,可以直接使用queryset.来进行统计
        # queryset.aggregate(total=Sum('money')).get('total')

        a = "¥{}".format(Record.objects.aggregate(total=Sum('money')).get('total'))
        print(a)
        # 需要有空字符串占位
        return ('', '数据合计', '', '', a, '2020年01月14日')

界面效果:

get_results 获取返回结果
该方法在simplepro 1.2及以上版本中生效,用于处理最终的结果集。

例子:

注意:

这里的queryset 改变过滤条件将不会影响返回的结果。如果需要操作queryset,

请在get_queryset方法中进行

results 将会是一个 dict list,而不是对象,获取属性 需要用get

def get_results(self, results, request, queryset):
print(‘处理结果集’)
new_results=[]

for item in results:
    if 'aa' in item:
        print(item.get('aa'))
        item['aa']='这是一个测试属性'

    new_results.append(item)

return new_results

Media 自定义引入js和css

Media 遵从原生django admin的写法,并且处理也是django实现,simplepro未做任何文件处理,只做引入动作。

例子

@admin.register(Department)
class DepartmentAdmin(admin.ModelAdmin):

    class Media:
        js=('aa.js','bb.js')
        css=('dd.css','cc.css')
在页面解析的时候 会调用下列方式进行引入

<script type="text/javascript" src="{% static 'aa.js'%}">
核心源码
引入js部分:
 {% if media.js %}
    {% for js in media.js %}
    <script type="text/javascript" src="{% static js %}"></script>
    {% endfor %}
{% endif %}
引入css部分:
{% if media.css %}
    {% for css in media.css %}
    <link rel="stylesheet" href="{% static css %}">
    {% endfor %}
{% endif %}

在通过引入自己的js和css之后,可以对页面进行扩展,调用simplepro的js sdk 可以实现意想不到的效果,比如表格format,添加自定义按钮,拦截按钮事件等。具体请看jssdk

常见问题

  1. 权限
    增删改查按钮,可以利用系统自带的权限进行控制,对于自定义的action,也支持权限控制。 请参考文档:权限文档

  2. 数据权限
    对于数据级别的权限,不属于框架的范畴,这是需要自己在业务逻辑的处理上进行控制,可以利用ModelAdmin中的get_queryset方法来进行数据的过滤。

例如:

class SimpleAdmin(...):

    def get_queryset(request,qs):
        qs.filter(user__id=123,type_id=321)
        return qs
Django 中使用 apscheduler 可以轻松地实现定时任务的调度。下面是配置步骤: 1. 安装 apscheduler: ```python pip install apscheduler ``` 2. 在 Django settings.py 中添加 apscheduler 配置: ```python # Apscheduler settings SCHEDULER_CONFIG = { 'apscheduler.jobstores.default': { 'type': 'sqlalchemy', 'url': 'sqlite:///jobs.sqlite' }, 'apscheduler.executors.default': { 'class': 'apscheduler.executors.pool:ThreadPoolExecutor', 'max_workers': '20' }, 'apscheduler.job_defaults.coalesce': 'false', 'apscheduler.job_defaults.max_instances': '3', 'apscheduler.timezone': 'Asia/Shanghai' } ``` 这里使用了 sqlite 作为 apscheduler 的 job 存储方式,并且设置了最大工作线程数为 20 个,任务不合并,最多同时运行 3 个,时区设置为 Asia/Shanghai。 3. 在 Django 的 app 中定义一个定时任务: ```python from apscheduler.schedulers.background import BackgroundScheduler scheduler = BackgroundScheduler() @scheduler.scheduled_job(trigger='interval', seconds=5) def test_job(): print('Testing job...') ``` 这里定义了一个每 5 秒钟执行一次的测试任务。 4. 在 Django 的 app 中启动 scheduler: ```python from django.apps import AppConfig class MyAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'myapp' def ready(self): from . import scheduler scheduler.start() ``` 在这里启动了定义在 step 3 中的定时任务。 5. 在 Django 项目中加载 apscheduler 配置: ```python from apscheduler.schedulers.background import BackgroundScheduler from django.conf import settings scheduler = BackgroundScheduler(settings.SCHEDULER_CONFIG) ``` 这里加载了 step 2 中的 apscheduler 配置。 以上就是 Django 中使用 apscheduler 的配置方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值