• stark组件开发之列表页面应用示例


    已经解决的,自定义的扩展函数,功能。
    但是 不可能返回。 一个 固定的页面把!  应该是,点击那条 记录之后的编辑, 就会跳转到相应的,编辑页面。
    所以 这个标签的  <a href="/stark/app01/userinfo/change/1/">编辑</a>  他应该是这个样子!


    stark  是主路由中, 路由分发的  url 路径:

    app01/userinfo/change/1/
    这个 应该是 ,根据反向解析。 的来的路径。  最后的 参数 1 是。 每条记录自己的id 值。

    这是这个函数,调用之后,返回的结果。 除了 self.get_urls()  之外。 还有 app_name  和  namespace  这两个参数。

    反向解析 reverse()   需要的参数是, 一个路径整体的,别名。  namespace:name  例: stark:app01_userinfo_edit  这才是一个正确的参数.
    而且,对于带有正则分组的 URL。 还需要 加上一个额外的参数!

    所以,对代码结构进行了调整!
    首先:
    在,def register(self, model_class, handler_class=None, prev=None):  此函数注册阶段。需要将,StarkSite 类的, 单例对象。
    一并 传给  Handler  类!( 就是 将self 一起传给handler!)
    这里的self 就是 我们的单例 对象  site

    class StartSite(object):
        def __init__(self):
            self._registry = []
            self.app_name = "stark"
            self.namespace = "stark"
    
        def register(self, model_class, handler_class=None, prev=None):
    
            if handler_class is None:
                handler_class = StartHandler  # 做个默认的Handler
    
            self._registry.append(
                {'model_class': model_class, "handler": handler_class(self, model_class, prev), "prev": prev})

    这样,在 StarkHandler 基类, 以及他的子类们。 才能够 通过,这个参数, 调用到  self.namespace 这个参数。

    class StartHandler(object):
        list_display = []
    
        def __init__(self, site, model_class, prve):
            self.site = site
            self.model_class = model_class
            self.prev = prve
    
        def display_edit(self, obj=None, is_header=None):
            '''
            自定义页面,显示的列,(表头和内容)
            :param obj:   数据库中每一行记录的 model对象
            :param is_header:  判断是否为表头
            :return:
            '''
            if is_header:
                return "编辑表头"
            name = "%s:%s" % (self.site.namespace, self.get_edit_url_name)  # 拼接 stark:app01_userinfo_change
            print("<a href='%s'>编辑</a>" % reverse(name, args=(obj.pk,)))
            return mark_safe("<a href='%s'>编辑</a>" % reverse(name, args=(obj.pk,)))
    
        def display_del(self, obj=None, is_header=None):
            if is_header:
                return "删除表头"
            name = "%s:%s" % (self.site.namespace, self.get_del_url_name)
            return mark_safe("<a href='%s'>删除</a>" % reverse(name, args=(obj.pk,)))

    基类中, 定义了这些操作。  编辑和删除。 他们分别对应的是自己的, URL后缀。

    这样,就能得到! 各自的  命名空间,和别名。 然后进行拼接!
    最后的参数问题:
    因为是要展示到 列表页面的, 东西。 所以在列表的视图中:

    在确定 list_display 中传过来的参数。 是一个 函数之后。
    就会执行这个函数。 执行这个函数时。然后如果是, 标题的话! is_head=Ture.
    否则 就会将从数据库取出的,data_list 中的  每一条记录。 都会传给此函数的 obj 形参。
    执行时, 此函数, 就可以通过这个 model 对象。  拿到他自己的 id。
    并于, 发反向解析得到的 ,URL 进行拼接。 最终得到一个完整的  URl。
    然后 就可以进行访问了!

    当然最后一步, 就是怎么调用。 写在基类中的这个方法了!

    class UserInfoHandler(StartHandler):
    
        list_display = ["name", "age", StartHandler.display_edit, StartHandler.display_del]
    
    site.register(models.UserInfo, UserInfoHandler)

    这里 为啥直接使用。 类名 来调用这个方法。
    因为, 在循环 list_display 的时候, 我们需要的是一个函数, 而不是一个 绑定到对象的方法。  使用类来调用他自己下面定义的函数。 才能拿到一个 function 对象。  传参数的时候,  不要忘了,将自身传进去就好了!
    那么这个 self 是谁呢?
    就是在  register  函数执行的时候。 handler_class 这个参数传进来的是谁,谁就是这个对象。因为这里也进行了实例化。 并且还将这个对象放在一个字典中, 键就是 ”handler“ 。 所有的。后续所有的操作, 都是这个对象在活动。

    OK 处理到这里。 还有些问题。  我们的的表中,都是存储的单值。
    如果 有menu 这类的呢?  在模型表中就是, choice 的字段。
    比如:

    如果还是使用,当前的这种办法。 因为数据库中。保存的只是  1  2  这种数字。 而我们需要展示的是, 对应这个数字的中文。 该怎么办?
    先看看一个, 简单版本:

     

    通过这种方式。 确实可以显示正中文。 但是 总不能总是去写吧。 太麻烦!  再换一个方法:
    通过 闭包 的方式。 来做这件事。

    def get_choice_txt(title, field):
        '''
        对于 Stark组件中定义列时, choice如果想要显示中文信息,调用此方法即可。
        :param title:   希望页面上显示的表头
        :param field:  字段名称
        :return:
        '''
    
        def inner(self, obj=None, is_header=None):
            '''
            :param self:
            :param obj:  StarkHandler 里面列表视图函数 中 循环出的每一个 model对象
            :param is_header:
            :return:
            '''
            if is_header:
                return title
            method = "get_%s_display" % field
            return getattr(obj, method)()  #  从model对象中,根据这个字符串。找到这个方法。 并执行。 拿到中文结果后, 返回
        return inner

    class UserInfoHandler(StartHandler):
        # def choice_field_

        list_display = ["name", "age", "depart", get_choice_txt("性别", "gender"), StartHandler.display_edit,
                        StartHandler.display_del]

     ok  还是, 比较完美的。
    以后只要 ,有拿一张表。 想要对choice字段,进行一个自定制。 使用这个方法, 就可以了!

  • 相关阅读:
    GPS时钟参考源(GPS同步时钟)电力系统探讨
    GPS对时系统(时间同步系统)建设才是电力基础
    NTP授时服务器(NTP时钟服务器)基本原理介绍
    NTP授时服务器(北斗授时产品)在广播电视系统里的应用
    GPS北斗授时设备共视对比及传输链路接口
    基于NTP时钟服务器的时间同步数据采集系统
    利用GPS或北斗卫星开发的一款NTP授时服务器
    GPS时钟系统(卫星时钟同步)才是智能变电站的基础建设
    PTP精密时钟服务器IEEE1588(V2.0)协议浅析
    电子时钟显示屏,时间同步显示,GPS时钟系统
  • 原文地址:https://www.cnblogs.com/chengege/p/10738452.html
Copyright © 2020-2023  润新知