前情提要:
接着上一节的.stark自创组件的展示效果编写
展示数据
一:按照默认自带数据展示
即无一对一,一对多
1:先获取queryset对象
  
2:获取当前操作模型表对象数据
注意:list_display 为元祖,这样如果默认样式的时候会反射第一个索引所在的位置即
"__str__"
2>1视图层

2>2数据展示结果

2>3前端:


二:按照一对多展示
即一对多publish 展示
1:展示模型关系

2:在自定配置类中增加一对多内容,正向按照字段

3:前端效果

三:多对多显示
知识补充:
展示模型类对象
使用名字访问一个model的实例
模型名._meta.get_field("publish")

展示模型类对象名字

展示模型类对象app名字

 
展示默认名称
如果没有设置,则展示本身的属性名

如果展示了则显示设置的名字,注意此处设置了verbose 名字


1:前端反射默认方法
如果没有参数则不需要加括号
默认的配置__str__()方法,前端可以不用加括号直接显示

2:判断如果是多对多怎么处理内容
普通属性从self.list._display中拿取的是字符串
一对多,多对多的拿取出来的是对象
导入包 判断拿出的对象是否为manytomanyfiled类型
 
设置当为多对多的时候.抛出错误,多对多的时候需要,自定制列
 
3:判断字段是否为chiose字段
 

4:由于没有__str__ 属性
field_obj = self.model._meta.get_field(field_or_func) #获取模型对象
这句话,获取的是对象的字段属性,,但是其中没有没有

这段可能是错误的!!!
try..except 和raise 冲突
这么写不对

5: 自定制列展示多对多字段
知识点:
callable 判断是否为可调用的(函数和类可以调用)
直接把自定制函数扔到dis_play中

stites中放获取返回值,然后加入到列表中传到前端
这里的self 是类函数调用的方式.,因为原来类中需要穿参,现在增加一个参数而已,什么都行.但是最好是self
 
6:处理多对多内容
6>1: 在callable 内容中传入obj对象,方便操作数据

6>2:在自定制配置类中,通过obj 获取对应的作者信息

四:设置表头内容
1:如果是普通属性,非定制列 ,即只有 __str__

传出的是表明的大写
2:如果是普通属性,定制列 ,接收其他非属性多对多属性
3:如果是多对多,定制列,接收多对多函数

4 注册表书写:
  
五:设置编辑,删除,以及选择按钮增加到默认配置类
1:
设置展示自定制函数在stites中
注意导入safe包

该包,可以是后台传入的标签内容不会被转化,直接成为前端代码
from django.utils.safestring import mark_safe

其中删除和编辑的代码需要用到反向解析.
先导入包:

定义类名和表明

视图层设置反向解析name

反向解析代码
        # 反向解析当前访问表的增删改查URL
    def get_list_url(self):
        # 反向解析当前表的删除的URL
        list_url = reverse("%s_%s_list" % (self.app_label, self.model_name))
        return list_url
    def get_add_url(self, obj):
        # 反向解析当前表的删除的URL
        add_url = reverse("%s_%s_delete" % (self.app_label, self.model_name))
        return add_url
    def get_delete_url(self, obj):
        # 反向解析当前表的删除的URL
        delete_url = reverse("%s_%s_delete" % (self.app_label, self.model_name), args=(obj.pk,))
        return delete_url
    def get_change_url(self, obj):
        # 反向解析当前表的删除的URL
        change_url = reverse("%s_%s_change" % (self.app_label, self.model_name), args=(obj.pk,))
        return change_url
分析:方向解析名字为app名加表明 利用的是无名分组,注意无名分组为元祖传参
 def show_checkbox(self,obj=None,header=False):
        #展示选择列
        if header:
            return mark_safe("<input type='checkbox'>")
        return mark_safe("<input type='checkbox'>")
    def show_delbtn(self,obj=None,header=False):
        if header:
            return "删除"
        return mark_safe("<a href='%s'>删除</a>" % self.get_delete_url(obj))
    def show_editbtn(self,obj=None,header=False):
        if header:
            return "编辑"
        return mark_safe("<a href='%s'>编辑</a>" % self.get_change_url(obj))
属性说明:

self 为当前操作的模型配置类
obj=None 让默认对象的值为None,即当代用抬头的时候不用传值
header=False 让默认的header 为False ,使调用数据的时候不用传值,且 不反回抬头,只返回数据

获取表头中,是header =true 这样可以获取表头数据内容
2: 如果想在默认配置类中,直接展示
则需要在定义一个函数,把内容加入到自定制的list_display中

2 >1 :注意,现在所有调用list_display 的都需要换成该函数


效果图:


点击去也可以实现

 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号