• stark组件开发之组合搜索基本显示


    数据的获取,上一篇,已经有了!然后就是,如何进行展示的问题。
    到了展示这里,又有了新的问题, 因为从数据库,取得的数据。 分为 queryset 和 tuple 两种数据结构。
    tuple 中,只是字符串。 queryset中确实,model对象。

    而且  这些渲染出来后,全部都是 a 标签。 是可以点击的, 所以 href 超链接属性,是必须要有的。 而且还有一点是,默认选中。
      用户选择之后, 应该有一个提示,我当前选择的是那个标签。  而且因为组合搜索,先选中的条件,不能够被刷新。

    这种的 如果依靠模板做的话,也可以。但是代码就过于繁琐了。
    所以,决定这件事由,后端 python 代码来实现,  实现的方式,还是通过。 类。 生成对象来实现:
    在这里先,抛出一个知识点:  可迭代对象:

    这张图片展示的是,不可迭代对象。 如果视图对这个对象。进行迭代。 是会报错的。

    那么,该怎么搞呢?

    定义: 如果一个类中,定义了 def __iter__ (self)  方法。且该方法返回一个 迭代器 iterator。 那么就称该类实例化的对象为一个可迭代对象。  那么这个对象就可以被循环。

    迭代器和生成器。 生成器也是一种特殊的迭代器。  yield

    这时, 你会发现。  11  22  33 被打印出来了!

    而且这里,不一定非要是 [11,22,33,]   iter 函数里面。 可以随便定义。 只要返回值,是一个 迭代器就可以。

    so, 我在模板中,对这个类实例化的对象。进行 for 循环。 不就可以拿到它里面的值了吗?

    看例子:

    成功的在,页面展示了。所有的数据。  注意: 财务 和  CEO 虽然显示的是,字符串。 是因为我在  model 的类中, 定义了 __str__
    ,其实 他是一个对象。

    这样,我们就可以在。 这了 __iter__ 方法里面。进行判断。 当前数据的类型。 从而返回不同的数据。
    而模板中就只需要,一个 简单的, 两层循环, 就能完成。 想要的工作。

     so  我这里使用。  yield  生成器的方式。 来做这件事:

    class SearchGroupRow(object):
        def __init__(self, queryset_or_tuple):
            self.queryset_or_tuple = queryset_or_tuple
    
        def __iter__(self):
            # if isinstance(self.queryset_or_tuple, list):
            #     for item in self.queryset_or_tuple:
            #         yield "<a href='#'>%s</a>" % item[1]
            # else:
            #     for item in self.queryset_or_tuple:
            #         if isinstance(item, Model):
            #             print(item)
            #         yield "<a href='#'>%s</a>" % item
            for item in self.queryset_or_tuple:
                if isinstance(item, tuple):
                    yield "<a href='#'>%s</a>" % item[1]
                else:
                    yield "<a href='#'>%s</a>" % item
    # 这里两种方式, 都可以。完成 这个工作。
            {% for row in search_group_row_list %}
                {% comment %}row是queryset 或者 元组{% endcomment %}
                <div>
                    {% for item in row %}
                        {{ item|safe }}
                    {% endfor %}
                </div>
            {% endfor %}

     

    OK  成功。

  • 相关阅读:
    JS中的constructor、prototype、__proto__的要点理解
    call、apply、bind的源码模拟
    js中的继承方式
    IPV6
    java8 instant localDateTime
    FileInputFormat 的实现之TextInputFormat
    Git服务器,仓库的hook监控
    Linux 开机启动图形界面,shell界面
    java操作Hbase
    Linux 下安装 storm
  • 原文地址:https://www.cnblogs.com/chengege/p/10744787.html
Copyright © 2020-2023  润新知