使用 Django 模版內建過濾器 unordered_list 實現樹形結構
官方文件解釋:
Recursively takes a self-nested list and returns an HTML unordered list – WITHOUT opening and closing <ul>
tags.
The list is assumed to be in the proper format. For example, if var
contains ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]
, then {{ var|unordered_list }}
would return:
<li>States
<ul>
<li>Kansas
<ul>
<li>Lawrence</li>
<li>Topeka</li>
</ul>
</li>
<li>Illinois</li>
</ul>
</li>
接下來我們就來實現上面的效果。
環境版本:
- python 2.7.10
- Django 1.8.5
首先在 models.py
新增程式碼:
#coding:utf-8
from django.db import models
class Area(models.Model):
name = models.CharField('名稱', max_length=50, unique=True)
parent = models.ForeignKey('self', verbose_name='上級區域', null=True, blank=True, related_name='children')
class Meta:
db_table = 'area'
verbose_name = verbose_name_plural = '省/市/地區(縣)'
def __unicode__(self):
return self.name
在 admin.py
新增程式碼:
from django.contrib import admin
from .models import Area
class AreaAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'parent')
admin.site.register(Area, AreaAdmin)
然後在後臺新增資料。
![2733312-95d79da3e491c646.png](https://i.iter01.com/images/c6273adedf03c7ea5654794b8369cf5d9aefe7d728808d910bcf4b70e8bc2aab.png)
按照官方文件的說法,顯示時傳遞給模版的資料應該是下面這種格式:
['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]
所以我們需要寫一個遞迴的工具函式。得到根節點,傳遞給 display
,然後把 display
函式生成的列表傳遞給模版:
from django.shortcuts import render_to_response
from .models import Area
def display(areas):
display_list= []
for area in areas:
display_list.append(area.name)
children = area.children.all()
if len(children) > 0:
display_list.append(display(children))
return display_list
def tree(request):
areas = Area.objects.filter(parent=None)
return render_to_response('tree.html', {'var': display(areas)})
最後在模板中新增:
{{ var|unordered_list }}
就可以看到顯示效果了。
![2733312-d7e6ec8aaa67953b.png](https://i.iter01.com/images/0b3a488522f6e208b33efc3493209976aa323ef42f7c441e5baf68d5b9b90d7e.png)
因為有時候需求不止這麼簡單,比如有時需要展現樣式等等,unordered_list
就遠遠不夠了。這個時候就需要使用 mptt
,請參照我的另一篇文章 使用 django-mptt 實現樹形結構。
相關文章
- JS遞迴過濾樹形結構陣列物件--模糊查詢JS遞迴陣列物件
- DRF內建過濾元件與排序元件結合使用元件排序
- 樹形結構
- LayUI—tree樹形結構的使用UI
- Vue遞迴元件實現樹形結構選單Vue遞迴元件
- 樹形結構處理
- 特殊的資料結構(布隆過濾器)的原理和實現及探究資料結構過濾器
- PHP實現布隆過濾器PHP過濾器
- 七、基本資料結構(樹形結構)資料結構
- django2中自定義過濾器Django過濾器
- Django(31)模板中常用的過濾器Django過濾器
- Django4:模板(zhong)—常用過濾器Django過濾器
- markdown樹形結構生成工具
- Spring Cloud構建微服務架構—服務閘道器過濾器SpringCloud微服務架構過濾器
- 樹結構與Java實現Java
- 乾貨,使用布隆過濾器實現高效快取!過濾器快取
- ROS 八叉樹地圖構建 - 使用 octomap_server 建圖過程總結!ROS地圖Server
- MySQL怎樣透過Adjacency List儲存樹形結構?MySql
- 資料結構中樹形結構簡介資料結構
- Django(69)最好用的過濾器外掛Django-filterDjango過濾器Filter
- 使用Winston替換NestJS專案中Nest內建的logger以及結合全域性異常過濾器JS過濾器
- 4、過濾器的使用及自定義過濾器過濾器
- Django自定義模板標籤與過濾器Django過濾器
- SpringBoot實現過濾器、攔截器與切片Spring Boot過濾器
- Django(67)drf搜尋過濾和排序過濾Django排序
- 在vue專案中使用樹形結構的穿梭框Vue
- 使用Dockerfile構建django專案DockerDjango
- Filter過濾器的使用Filter過濾器
- 字串陣列轉為樹形結構字串陣列
- Android 多級樹形結構顯示Android
- Linux 下樹形結構的檢視Linux
- CSS 實現樹狀結構目錄CSS
- 基於PHP + TRIE樹實現敏感詞過濾演算法PHP演算法
- VUE 實現 Studio 管理後臺(七):樹形結構,檔案樹,節點樹共用一套程式碼 NodeTreeVue
- 過濾器和監聽器總結過濾器
- 實現布隆過濾器的三種方式過濾器
- 詳解布隆過濾器原理與實現過濾器
- Go語言實現布穀鳥過濾器Go過濾器
- 使用管道流實現Java 8階段構建器Java