數據的獲取,上一篇,已經有了!然后就是,如何進行展示的問題。
到了展示這里,又有了新的問題, 因為從數據庫,取得的數據。 分為 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_tupledef __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>" % itemfor 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? 成功。
?