使用 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)
然後在後臺新增資料。
按照官方文件的說法,顯示時傳遞給模版的資料應該是下面這種格式:
['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 }}
就可以看到顯示效果了。
因為有時候需求不止這麼簡單,比如有時需要展現樣式等等,unordered_list
就遠遠不夠了。這個時候就需要使用 mptt
,請參照我的另一篇文章 使用 django-mptt 實現樹形結構。
相關文章
- Python Django進階教程(二)(模版過濾器,標籤)PythonDjango過濾器
- angular內建過濾器-filterAngular過濾器Filter
- [Swing]樹形結構的實現
- JS遞迴過濾樹形結構陣列物件--模糊查詢JS遞迴陣列物件
- DRF內建過濾元件與排序元件結合使用元件排序
- 樹形結構
- LayUI—tree樹形結構的使用UI
- Vue遞迴元件實現樹形結構選單Vue遞迴元件
- Django模板系統 — 過濾器Django過濾器
- django自定義 過濾器薦Django過濾器
- layui樹形結構UI
- java樹形結構Java
- php tree類的使用(樹形結構)PHP
- 不用遞迴實現樹形結構的一種方法遞迴
- 詳解Django自定義過濾器Django過濾器
- django自定義過濾器例項Django過濾器
- 樹形結構處理
- 特殊的資料結構(布隆過濾器)的原理和實現及探究資料結構過濾器
- PHP實現布隆過濾器PHP過濾器
- 七、基本資料結構(樹形結構)資料結構
- django2中自定義過濾器Django過濾器
- Django(31)模板中常用的過濾器Django過濾器
- Django4:模板(zhong)—常用過濾器Django過濾器
- markdown樹形結構生成工具
- 樹結構與Java實現Java
- 乾貨,使用布隆過濾器實現高效快取!過濾器快取
- Django(69)最好用的過濾器外掛Django-filterDjango過濾器Filter
- 資料結構中樹形結構簡介資料結構
- Spring Cloud構建微服務架構—服務閘道器過濾器SpringCloud微服務架構過濾器
- 4、過濾器的使用及自定義過濾器過濾器
- Django自定義模板標籤與過濾器Django過濾器
- 如何在Java中返回樹形結構 最佳實踐Java
- ROS 八叉樹地圖構建 - 使用 octomap_server 建圖過程總結!ROS地圖Server
- MySQL怎樣透過Adjacency List儲存樹形結構?MySql
- 資料結構之通用樹結構的實現資料結構
- Django(67)drf搜尋過濾和排序過濾Django排序
- 前端樹形Tree資料結構使用-🤸🏻♂️各種姿勢總結前端資料結構
- 使用Dockerfile構建django專案DockerDjango