1.list页面自定列显示:
class PermissionConfig(sites.AryaConfig):
 
    def dabo(self, obj=None, is_header=False):
        if is_header:
            return "大波"
        else:
            return "大波-"+obj.caption
    list_display = ["caption", "url", dabo,"menu"]
 
sites.site.register(models.Permission, PermissionConfig)
 

2.功能界面更改:重写add_view使其界面展示url list---->
获取url_list

def get_all_url(patterns, prev, is_first=False, result=[]):
"""
[
(ur1,ur1,)
(ur1,ur1,)
(ur1,ur1,)
(ur1,ur1,)
]
:param patterns:
:param prev:
:param is_first:
:param result:
:return:
"""
if is_first:
result.clear()
for item in patterns:
v = item._regex.strip("^$")
if isinstance(item, RegexURLPattern):
val = prev + v
result.append((val, val,))
else:
get_all_url(item.urlconf_name, prev + v) return result
同时在permission_add.html和permission_add_popup.html适当位置添加如下代码用以渲染
<div>
    <h3>url-list</h3>
    <ul>
        {% for url in url_list %}
            <li>{{ url.0 }}</li>
        {% endfor %}
    </ul>
 
</div>

3.重写ModelForm深度定制功能页:编写PermissionModelForm以完成url以choice方式实现.
注意事项:
class PermissionModelForm(ModelForm):
    url=fields.ChoiceField() #若该字段名和Permission中的某字段重名,则会将该字段替换,不重名,则添加新的
    #from pro_crm.urls import urlpatterns
    #url.choices=get_all_url(urlpatterns,"/",True) #此种赋值方式1:会使urlpatterns提前执行,引发错误
                                                  #2.当新增url时,不能时时刷新,因为PermissionModelForm声明时会取一遍url,
                                                  #当用其new对象时,不会再去获取新的url,因此需要将获取url的逻辑写在__init__中
实现代码:

class PermissionModelForm(ModelForm):
url = fields.ChoiceField() # 若该字段名和Permission中的某字段重名,则会将该字段替换,不重名,则添加新的 # from pro_crm.urls import urlpatterns
# url.choices=get_all_url(urlpatterns,"/",True) #此种赋值方式1:会使urlpatterns提前执行,引发错误
# 2.当新增url时,不能时时刷新,因为PermissionModelForm声明时会取一遍url,
# 当用其new对象时,不会再去获取新的url,因此需要将获取url的逻辑写在__init__中 class Meta:
model = models.Permission
fields = "__all__" def __init__(self, *args, **kwargs):
super(PermissionModelForm, self).__init__(*args, **kwargs)
from pro_crm.urls import urlpatterns
self.fields["url"].choices = get_all_url(urlpatterns, "/", True)

4.list页面foreignKey和ManyToMany字段的显示,本质上是list_display列表中添加函数,在函数中控制显示逻辑choices
code:

class ClassListConfig(sites.AryaConfig):

    def course_display(self, obj=None, is_header=False):
if is_header:
return "班级"
else:
tpl = "{}({}期)".format(obj.course.name,obj.semester)
return tpl def teachers_display(self,obj=None,is_header=False):
if is_header:
return "任课老师"
else:
teachers = obj.teachers.all()
result = []
for teacher in teachers:
tpl = "<span>{}</span>".format(teacher.name)
result.append(tpl)
return mark_safe(" ".join(result)) list_display = ["school",course_display,"tutor",teachers_display,"price",] sites.site.register(models.ClassList,ClassListConfig)

5.list页面choices的显示:
class CustomerConfig(sites.AryaConfig):
    ....
    def gender_display(self,obj=None,is_header=False):
        if is_header:
            return "性别"
        else:
            return obj.get_gender_display()
 
    list_display = ["name",gender_display,"qq","consultant",courses_display]
sites.site.register(models.Customer,CustomerConfig)

 
 
 6.date的显示

    def date(self, obj=None, is_header=False):
if is_header:
return "交款日期"
else:
return obj.date.strftime("%Y-%m-%d") list_display = ["customer","class_list",pay_type_choices,"paid_fee","consultant",date]

 7.list_filter的配置

class CustomerConfig(sites.AryaConfig):

    .......

    list_filter = [
# sites.FilterOption("name",False,lambda x:x.name,lambda x:x.name),#这种配置无意义
sites.FilterOption("consultant",False,condition=Q(depart=1)),#传条件以显示筛选项
sites.FilterOption("course",True),#咨询课程
sites.FilterOption("gender",False),#choices ]
sites.site.register(models.Customer,CustomerConfig)

CRUD组件的高阶使用的更多相关文章

  1. 聊聊React高阶组件(Higher-Order Components)

    使用 react已经有不短的时间了,最近看到关于 react高阶组件的一篇文章,看了之后顿时眼前一亮,对于我这种还在新手村晃荡.一切朝着打怪升级看齐的小喽啰来说,像这种难度不是太高同时门槛也不是那么低 ...

  2. 当初要是看了这篇,React高阶组件早会了

    当初要是看了这篇,React高阶组件早会了. 概况: 什么是高阶组件? 高阶部件是一种用于复用组件逻辑的高级技术,它并不是 React API的一部分,而是从React 演化而来的一种模式. 具体地说 ...

  3. React文档(二十四)高阶组件

    高阶组件(HOC)是React里的高级技术为了应对重用组件的逻辑.HOCs本质上不是React API的一部分.它是从React的组合性质中显露出来的模式. 具体来说,一个高阶组件就是一个获取一个组件 ...

  4. React进阶之高阶组件

    前言 本文代码浅显易懂,思想深入实用.此属于react进阶用法,如果你还不了解react,建议从文档开始看起. 我们都知道高阶函数是什么, 高阶组件其实是差不多的用法,只不过传入的参数变成了react ...

  5. 【转】react的高阶组件

    React进阶之高阶组件   前言 本文代码浅显易懂,思想深入实用.此属于react进阶用法,如果你还不了解react,建议从文档开始看起. 我们都知道高阶函数是什么, 高阶组件其实是差不多的用法,只 ...

  6. 函数式编程与React高阶组件

    相信不少看过一些框架或者是类库的人都有印象,一个函数叫什么creator或者是什么什么createToFuntion,总是接收一个函数,来返回另一个函数.这是一个高阶函数,它可以接收函数可以当参数,也 ...

  7. react:高阶组件wrappedComponent

    什么是高阶组件? 高阶部件是一种用于复用组件逻辑的高级技术,它并不是 React API的一部分,而是从React 演化而来的一种模式. 具体地说,高阶组件就是一个接收一个组件并返回另外一个新组件的函 ...

  8. 高阶组件(Higher-Order Components)

    有时候人们很喜欢造一些名字很吓人的名词,让人一听这个名词就觉得自己不可能学会,从而让人望而却步.但是其实这些名词背后所代表的东西其实很简单. 我不能说高阶组件就是这么一个东西.但是它是一个概念上很简单 ...

  9. 修饰器&高阶组件

    一.修饰器 1.类的修饰 修饰器是一个函数,用来修改类的行为 function testable(target) { target.isTestable = true; } @testable cla ...

随机推荐

  1. Mina入门:mina版之HelloWorld[z]

    Mina入门:mina版之HelloWorld [z] 一,前言: 在完成上篇文章<Mina入门:Java NIO框架Mina.Netty.Grizzly简介与对比>之后,我们现在可以正式 ...

  2. CentOS日志列表

    anaconda/* 包含至少5个日志文件:anaccmda.log用于保存一般安装消息:anaconda.packaging.log用于保存包安装消息:anaconda.programJog用于调用 ...

  3. [SoapUI] 通过context获取response并解析里面的某个字段的值

    import com.eviware.soapui.support.GroovyUtils def groovyUtils = new GroovyUtils( context ) def realI ...

  4. Python 版本之 Anaconda

    https://www.anaconda.com/download/#linux Anaconda概述 Anaconda是一个用于科学计算的Python发行版,支持 Linux, Mac, Windo ...

  5. MySQL之练习题5

    .将所有的课程的名称以及对应的任课老师姓名打印出来,如下: SELECT cname,tname FROM course INNER JOIN teacher WHERE course.teacher ...

  6. Android中px, ppi, dpi, dp, dip, sp概念解析

    Android中px, ppi, dpi, dp, dip, sp概念解析

  7. 2018.09.16 bzoj3626: [LNOI2014]LCA(树链剖分)

    传送门 树链剖分好题. 对于每个点维护一个值vi" role="presentation" style="position: relative;"&g ...

  8. 有趣的NaN类型

    在学习Java集合的时候遇到了Float.isNaN(float)函数,点进去一看就不理解了,函数实现如下: public static boolean isNaN(float v) { return ...

  9. python小练习--函数调用函数,让对象具有能动性

    class Box:#定义一个类名为Box,类名后不必有括号,类包含类属性和类方法,这个类没有定义类属性 '''这是一个计算体积的类'''#这是这个类的__doc__属性,执行类后就可以在交互界面输入 ...

  10. PHP中的mb_convert_encoding与iconv函数介绍

    php传输乱码 mb_convert_encoding这个函数是用来转换编码的.原来一直对程序编码这一概念不理解,不过现在好像有点开窍了. 不过英文一般不会存在编码问题,只有中文数据才会有这个问题.比 ...