上一篇,我只是做了。 默认的显示。

    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

能看出的是, 我返回的这个  yield  只是需要一个, 文本的信息。  而且是在这里做了判断,类型。
改进一下, 既然我只需要一个文本信息。 那么 这个工作, 应该交给 使用者,自己进行指定。
比如  默认返回   <a href='#'>男</a>   我想加点东西,比如  <a href='#'>男666</a>

而且,并不是所有的都加。  如果我直接在  __iter__ 中。 给他加666。 也是可以的, 只需要在 search_group 列表。 加入对象的时候。为对象, 添加一个参数就可以了。

但是我想换一种方式, 这个参数还是需要制定的, 但是获取文本的这个工作。 我交给   Option 类来做。 在类中添加一个参数。用于在最初的类型判断时, 就指定出,当前的 这个 field 对象。  是一个 choice 还是一个  Model 对象。

class Option(object):
'''使用组合搜索, 想要一些自己的搜索条件。 可扩展可继承'''
def __init__(self, field, db_condition=None, text_func=None):
'''
:param filed: 组合搜索关联的字段
:param db_condition: 数据库关联查询时查询的条件
:param text_func: 此函数用于,页面组合搜索的文本和样式
'''
self.field = field
self.db_condition = db_condition
self.text_func = text_func
if not db_condition:
db_condition = {}
self.db_condition = db_condition self.is_choice = False # 用于判断field对象里面是一个 choice列表 or 外键的queryset
  # 添加的函数就是这个,
def get_text_func(self, field_obj):
'''
获取文本,的函数。(从)
:param field_obj: (1, "男") or model对象
:return:
'''
if self.text_func: # 这个参数就是让用户来自己制定的。 下面展示如何使用。
return self.text_func(field_obj)
    # 通过 is_choice 判断是否是 choice。 决定返回的是,元组中的 第二个元素。 还是关联表的表名(verbose_name="部门")
if self.is_choice:
return field_obj[1]
return str(field_obj) def get_db_condition(self, request, *args, **kwargs):
'''预留继承后的重写函数, 重写后,次基类中的该方法,将被覆盖。 默认返回的是开发者输入的值。'''
'''重写后, 可根据,前端的返回值,进行一定的判断'''
return self.db_condition def get_queryset_or_tuple(self, model_class, request, *args, **kwargs):
'''根据字段去获取数据库关联的数据''' # 根据gender或者classes字符串,组自己对应的model类中,找到字段对象,再根据对象,获取关联的数据
field_obj = model_class._meta.get_field(self.field) # 固定用法mate 类,中的get_field() 就可以根据字符串获取对应的对象
# 对field_obj 的类型做判断。 来确定他是一个 choice 还是一个 foreignkey 外键
if isinstance(field_obj, ForeignKey) or isinstance(field_obj, ManyToManyField):
# 获取关联表中的, 数据 django1.0 版本使用 field_obj.rel.model.objects.all()
db_condition = self.get_db_condition(request, *args, **kwargs)
return SearchGroupRow(field_obj.related_model.objects.filter(**db_condition), self)
# 这里得到的是 Queryset 类型
else:
# 获取 choice 的数据 field_obj.choices
self.is_choice = True
return SearchGroupRow(field_obj.choices, self) # 这里得到的是 tuple 类型

在  UserInfoHandler 这个类中, 为search_group 添加 对象的时候。 可以选择性的为, Option类,添加一个函数进去。  如果添加了那么就会执行,传入的这个函数。 页面进行显示的时候, 就能够根据,用户自己的函数,逻辑进行展示。

class UserInfoHandler(StartHandler):
    ...................# 配置组合搜索,想要展示哪些, 搜索的条件
search_group =   [
Option("gender",text_func=lambda field_obj:field_obj[1]+""),
Option("classes"),
MyOption("depart",text_func=lambda x:x.title + "123"),
]

最后就是,原来的  __iter__ 改成啥样了呢?

class SearchGroupRow(object):
def __init__(self, queryset_or_tuple, option):
self.option = option
self.queryset_or_tuple = queryset_or_tuple def __iter__(self):
'''默认显示。 用户可以自定制'''
for item in self.queryset_or_tuple:
text = self.option.get_text_func(item)
yield "<a href='#'>%s</a>" % text

变简单了!不再进行判断类型。 因为这个工作,前面已经做了。  这里就只是执行了一下 传进来 option 对象下的  get_text_func()这个函数。 并且将当前循环的  field 对象。 传给了他。
最后看一下页面效果:

能看出,  gender  我进行了自定制。 后面加了 666
derpart  进行了自定制。 后面加了 123
classes  没有自定制, 默认显示的就是。 模型表中  __str__ 返回的值。

 最后一点,就是标题了。 在每个前面,添加上一个标题。 这样就知道,我选择的是什么选项了:

改动也不是很大。 就是通过  verbose_name  获取。 field 对象。 中的  verbose_name 设置的文字。

然后 传给SearchGruop 类。 实例化的时候, 对象就拥有这个参数。
然后  __iter__ 函数中,返回一个这个值就可以了。

class SearchGroupRow(object):
def __init__(self, queryset_or_list, option, title):
self.title = title
self.option = option
self.queryset_or_list = queryset_or_list def __iter__(self):
for item in self.queryset_or_list:
yield self.title
yield "<a>全部</a>"
text = self.option.get_text_func(item)
yield "<a href='#'>%s</a>" % text
class Option(object):
'''使用组合搜索, 想要一些自己的搜索条件。 可扩展可继承'''
def __init__(self, field, db_condition=None, text_func=None):
self.field = field
self.db_condition = db_condition
self.text_func = text_func
if not db_condition:
db_condition = {}
self.db_condition = db_condition self.is_choice = False # 用于判断field对象里面是一个 choice列表 or 外键的queryset
  ........................
def get_queryset_or_list(self, model_class, request, *args, **kwargs):
'''根据字段去获取数据库关联的数据''' # 根据gender或者classes字符串,组自己对应的model类中,找到字段对象,再根据对象,获取关联的数据
field_obj = model_class._meta.get_field(self.field) # 固定用法mate 类,中的get_field() 就可以根据字符串获取对应的对象
title = field_obj.verbose_name # 获取到,文件的 verbose_name
# 对field_obj 的类型做判断。 来确定他是一个 choice 还是一个 foreignkey 外键
if isinstance(field_obj, ForeignKey) or isinstance(field_obj, ManyToManyField):
# 获取关联表中的, 数据 django1.0 版本使用 field_obj.rel.model.objects.all()
db_condition = self.get_db_condition(request, *args, **kwargs)
return SearchGroupRow(field_obj.related_model.objects.filter(**db_condition), self, title) # 传进来
# 这里得到的是 Queryset 类型
else:
# 获取 choice 的数据 field_obj.choices
self.is_choice = True
return SearchGroupRow(field_obj.choices, self, title) # 这里得到的是 tuple 类型

stark组件开发之组合搜索高级显示和扩展的更多相关文章

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

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

  2. stark组件开发之组合搜索页面效果和 URL

    页面效果,只是样式.这个好解决!yield 的时候. 返回几个样式出去就好了! 并且前端写上一些样式的css {% if search_group_row_list %} <div class= ...

  3. stark组件开发之组合搜索实现思路

    - 关键字搜索. 可以做到的效果是, 输入20. 后太通过 Q()  函数. 来实现.  搜索是一个大的问题点. -  要想实现组合搜索, 首先要 明确的一点是. 在我当前的页面上, 正在进行展示的是 ...

  4. stark组件开发之关键搜索

    - 模糊搜索: 在页面生成一个表单.  以get 方式, 将数据提交到.当前查看页面. 后台接收数据,然后进行筛选过滤. 着个也需要,用户自定制!   定义一个  search_list  这个值,默 ...

  5. stark组件开发之列表页面定制列

    先看一张页面展示的效果图: 看一看我的  model 表!是什么样子: 看一看数据库是什么样子: 看 页面展示图,有表头. 有数据.模型表中,每一个字段, 都指定了 verbose_name. 如何解 ...

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

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

  7. 轮播组件/瀑布流/组合搜索/KindEditor插件

    一.企业官网 ### 瀑布流 ​ Models.Student.objects.all() #获取所有学员信息 ​ 通过div进行循环图片和字幕 ​ 1.以template模板方法实现瀑布流以列为单位 ...

  8. stark组件开发之添加按钮显示和URL

    添加: 需求: 根据用户的权限, 决定是否,有添加按钮.  通过配置进行定制,预留钩子进行权限的判断. class StartHandler(object): .................... ...

  9. stark组件开发之列表页面预留钩子方法。 可根据用户的不同,显示不同的列

    要实现,这个方法.子类中 list_diplay 这个列表, 就不能够写死.他应该是 可以根据.用户的不同,返回不同的值. 所以 就需要一个函数, 可以进行判断当前用户是谁. 并且往这个列表中添加,他 ...

随机推荐

  1. 理解block和inode

    什么是block和inode? 定义:block就像是杯子 inode就像是杯子的编号,因为杯子太多了 1.根据文件的大小,在磁盘中储存时会占用一个或多个block:那么究竟多大的文件会使用一个blo ...

  2. linux服务器后台运行服务

    linux 后台运行一个服务 难免会遇到在Linux,后台执行任务.下面,总结了一下关闭窗口任然在后台执行的方法,例如 #执行一个打包命令 tar czf /data/backup.tgz /data ...

  3. python基础内容目录

    一  python基础 二  python基础数据类型 三  python文件操作及函数初识 四  python函数进阶 五  python装饰器 六  python迭代器与生成器 七  python ...

  4. js基础面试篇

    1,js中的new做了什么? function Person () { this.name = name; this.age = age; this.sex = sex this.sayName = ...

  5. maltab-图像拼接(左右两幅图)

    图像拼接 参考自 https://blog.csdn.net/m0_37565736/article/details/79865990 并修改了其中错误的地方,添加自己的讲解或者看法. 我要拼接的是一 ...

  6. Anatomy of a Database System学习笔记 - 概论、并发控制

    <Anatomy of a Database System>这篇发表于87年.一共48页的论文据说是DBA入门必看,但是找了全网没有找到中文翻译.这篇文章对关系型数据库确实有提纲挈领的作用 ...

  7. 由2个鸡蛋从100层楼下落到HashMap的算法优化联想

    题目: 有一栋楼共100层,一个鸡蛋从第N层及以上的楼层下落会摔破,在第N层以下的楼层不会摔破,给你两个鸡蛋,设计方案找出N,并且保证在最坏的情况下,最小化鸡蛋下落的次数.(鸡蛋没有摔破是可以重复利用 ...

  8. 使用samba 共享Linux文件到Windows

    1.使用yum命令安装了samba服务 #yum install samba 2.配置/etc/samba/smb.conf文件,在最后一行添加下面一段配置: #vi /etc/samba/smb.c ...

  9. FPGA——流水灯(一)

    对于FPGA的结构原理,先不进行全面的了解,先能根据教程程序看得懂,写得出来跑起来.慢慢的了解程序运行的原理,各种语法的使用. 今天对流水的程序有一个认识,熟悉软件的使用,语法规则,原理.以正点原子的 ...

  10. v-charts 第一次亲密接触

    v-charts是什么鬼 v-charts是饿了么团队开源的一个图表库,vue+echarts开发.用element-ui直接集成echarts有些费劲,而v-charts已经封装成vue组件,可以直 ...