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. Maven + spring + Mybatis + SpringMVC

    tomcat版本:apache-tomcat-7.0.70 一.新建一个maven的web项目 1.1.请勾选“Create a simple project”,创建一个简单的项目,这里不使用模板.也 ...

  2. Alluxio/Tachyon如何发挥lineage的作用?

    在Spark的RDD中引入过lineage这一概念.指的是RDD之间的依赖.而Alluxio则使用lineage来表示文件之间的依赖.在代码层面,指的是fileID之间的依赖. 代码中的注释指出: * ...

  3. 常用C字符串函数

    static void str_repalce(char *src,char *from,char *to) {     char *p,*q;     int lenFrom;     int le ...

  4. 2018.10.15 NOIP训练 百事世界杯之旅(期望dp)

    传送门 期望题. 其实跟dpdpdp关系并不大. 考虑f[i]f[i]f[i]表示已经凑出了iii个需要的次数. 显然有:f[i]=ni∗f[i]+nn−i∗f[i+1]+1f[i]=\frac {n ...

  5. CentOS里vim基本操作

    1.关于退出 :wq!  ----强制保存退出 :wq  ---- 保存退出 :x   ----- 作用和:wq 一样 ZZ  ---- 作用和:wq一样,(注意Z是大写的,并且不是在命令模式) :q ...

  6. POJ 3686 The Windy's (最小费用流或最佳完全匹配)

    题意:有n个订单m个车间,每个车间均可以单独完成任何一个订单.每个车间完成不同订单的时间是不同的.不会出现两个车间完成同一个订单的情况.给出每个订单在某个车间完成所用的时间.问订单完成的平均时间是多少 ...

  7. windows开启禁用网卡

    ' 在Windows中实现sudo命令--命令行环境中获取管理员权限 'ShellExecute 方法 '作用: 用于运行一个程序或脚本. '语法 ' .ShellExecute "appl ...

  8. obj-c的优缺点

    优点: 1) Cateogies : 类别 2) Posing : 扮演 3) 动态识别 : 编译时与运行时动态识别类型 4) 指标计算 : 指针计算 指针的 +- * / 5) 弹性信息传递 : 某 ...

  9. android java层实现hook替换method

    Android上的热修复框架 AndFix 大家都很熟悉了,它的原理实际上很简单: 方法替换——Java层的每一个方法在虚拟机实现里面都对应着一个ArtMethod的结构体,只要把原方法的结构体内容替 ...

  10. Quartus II中使用脚本转换sof到rbf文件

    1.  新建一个文本文件,保存为任意但有意义的名字,如:sof_to_rbf.bat,注意,保存时请不要使用默认的格式,应该手动从.txt切换为all files 2.  在文本中输入以下内容: %Q ...