stark 组件之显示页面的设置

 

querydict的三个特性>>点我

用户输入地址如下

 1在stark项目中的apps中写入一个函数,让项目启动的时候扫描每个app中的stark.py文件

 

 在项目的url.py中引入  自己定义的urls方法,生成url

2.进入用户自己写的实例化的单例对象site的urls方法中去

3.调用get_urls()方法得到他的返回值

4.找到model_config中的这个urls方法得到他的返回值

 

找到model_config中的urls方法获取返回值

 5.根据用户数据的地址  返回响应的视图函数

用户输入的地址会给返回self.show_list的函数

 

 

1     new_data_list中的代码分析

 1)data_list是从数据库中将所有的数据取出来

2)data_list = self.model.objects.all()

用到的第二个列表的由来  new_list_display=self.new_list_display()

 #构建一个含有编辑删除复选框的默认类,并且配合用户自定义的list_display中的内容
    def new_list_display(self):
        new_list_display=[]
        #将原有的数据放进去
        new_list_display.extend(self.list_display)
        #将编辑方法放进去   当self.list_display_link中的值为空的时候,则走这个
 

if not self.list_display_links: new_list_display.append(ModelStark.edit) #将删除方法发进去 new_list_display.append(ModelStark.delete) #将选择框放进去 new_list_display.insert(0,ModelStark.checkbox) return new_list_display #形成一个这种的列表[checkbox,'__str__',edit,delete]

 


 new_data_list = []  #先定义一个空的列表
        #生成表数据
        for obj in data_list:
            temp = []
            for filed in new_list_display:#list_display中的字段,在例表中
                #如   ['address','email'],在循环中将每个字段取出来
                # if isinstance(filed,str): #先判断这个字段是不是字符串,是的话给加入,
                    #但是'__str__'这种方法也不能识别,不能用
                if callable(filed):#该内容是可调用的,函数可调用返回True   判断是否为方法
                    print('打印方法的名称========',filed.__name__,type(filed.__name__))
                    if filed.__name__=='edit':  #判断这个方法的名称是否是 dite  如果是的话,下边的方法
                        # if not self.list_display_links:
                        print('执行这个将编辑按钮返回的界面了 ')
                        # val=filed(self,obj)#这里注意,他会调用自己累中的属性和方法不会调用父类的
                        #所以这个self就是指的是自己先前的
                    #将此数据对象传给函数,用于写入数据。
                        val=self.get_link_tags(obj,'编辑')  #调用get_link_tags方法,得到按钮<a href="  ">编辑</a>  这样的按钮
    #get_link_tagd函数的代码       
    #获取点击标签的按钮和肩上href的内容
    def get_link_tags(self,obj,val):
        #request这个内容没有给传过来  但是调用这个函数的show_list函数中已经定义了request这个,
        # 所以可以直接拿过来用
        params=self.request.GET #获取请求头中带的信息,
        # 如 http://127.0.0.1:8000/stark/app01/publish/?a=1&b=2
        #获取的信息就是{a:1,b:2}是字典形式的
        import copy
        params=copy.deepcopy(params)
        #深拷贝params将_mutable属性设置为True
        params._mutable=True
        #引入QueryDict
        from django.http import QueryDict
        qd = QueryDict(mutable=True)
        #对他进行设置
        qd['list_filter'] =params.urlencode()# urlencode()方法可以将数据{a:1,b:2}保存成a=1&b=2的形式
        s=mark_safe('<a href="%s?%s">%s</a>' % (self.get_edit_url(obj),qd.urlencode(),val))#
        #
        return s


                 temp.append(val)
else: val = filed(self, obj) temp.append(val) else: if filed in self.list_display_links: val = getattr(obj, filed) # 利用反射的原理将对象中的属性值取出来 #用方法将用户写入的数据信息填到标签按钮上,当点击的时候就带上这些内容 val=self.get_link_tags(obj,val) # 调用对象的动态方法get_link_tags
    
# val=mark_safe('<a href="%s">%s</a>' %(self.get_edit_url(obj),val)) else: val = getattr(obj, filed) # 利用反射的原理将对象中的属性取出来 temp.append(val) new_data_list.append(temp) #经过这个循环将数据放进new_data_list这个列表中 这里边的数据是页面展示的数据

 

 title_list的数据获取

new_list_display=self.new_list_display()
title_list=[]
        for j in new_list_display:  #循环找出这里边的数据
            if callable(j):
                # 用函数名.__name__的方法能取出函数的名字
                # 但是取出的数据是英文,所以想显示中文不能用这个
                # print('这是函数的名字=======================',j.__name__)
                # title_list.append(j.__name__)
                val=j(self,is_heard=True)
                title_list.append(val)
            else:
                if j=='__str__':#判断当标题列表为__str__时,要用这个来让他显示
                    title_list.append(self.model._meta.model_name.upper())
                else:
                    currneobj=self.model._meta.get_field(j)
                    title_list.append(currneobj.verbose_name)

 add_url的获取

add_url=self.get_add_url()

get_add_url中的代码

用到的知识点

1:mark_safe   

a=mark_safe('<a href="%s?%s">%s</a>' % (self.get_edit_url(obj),qd.urlencode(),val))
直接将a返回给HTML文件得到的就是a标签按钮

2: 反射 getattr

 val = getattr(obj, filed)  # 利用反射的原理将对象中的属性值取出来  
                        #用方法将用户写入的数据信息填到标签按钮上,当点击的时候就带上这些内容

 3:  在HTML页面中  

  {% for form in my_form %}
                    <div class="form-group" >
           #form.label可以显示每一个字段的 verbose_name值,没有设置的显示字段名
    
                            <label for="{{ form.pk }}">{{ form.label }}</label>
                            {{ form }} <span class="error">{{ form.errors.0 }}</span>
{#                            这里传过来的数据  pop('数据')数据要用引号引起来,因为传过来的是参数#}
                            <a class="add_new" onclick="pop('{{ foo.url }}')" style="position: absolute;top: 0;height: 0;" 
                  href
="">++</a> </div> {% endfor %}

4:在注册页面中

  

class Bookconfig(ModelStark):

    list_filter=['authors','publishs','state']
    #当要显示字段中带choices属性的内容时
    def state(self,obj=None,is_heard=False):
        if is_heard:
            return '编辑'
        #用obj.get_state_display()的方法可以显示每一条数据对象的(1,'已出版')中的已出版字段
        return obj.get_state_display()
    list_display = ['title','price',state,'authors']
site.register(Book,Bookconfig)
site.register(Author)


 

  

 

posted on 2018-03-22 19:13  王大拿  阅读(137)  评论(0)    收藏  举报

导航