Django - 如何集成使用sitetree插件

問(wèn)題背景:

在使用Metronic作為前端模版的時(shí)候, 默認(rèn)的左側(cè)導(dǎo)航欄的效果如下圖所示:
Metronic 左側(cè)導(dǎo)航欄

其示例Html文件對(duì)于這一個(gè)導(dǎo)航欄的實(shí)現(xiàn)長(zhǎng)達(dá)1000多行监透,此處只截取部分展示:

<li class="nav-item  ">
    <a href="javascript:;" class="nav-link nav-toggle">
        <i class="icon-settings"></i>
        <span class="title">Form Stuff</span>
        <span class="arrow"></span>
    </a>
    <ul class="sub-menu">
        <li class="nav-item  ">
            <a href="form_controls.html" class="nav-link ">
                <span class="title">Bootstrap Form
                    <br>Controls</span>
            </a>
        </li>
        <li class="nav-item  ">
            <a href="form_controls_md.html" class="nav-link ">
                <span class="title">Material Design
                    <br>Form Controls</span>
            </a>
        </li>
        <li class="nav-item  ">
            <a href="form_validation.html" class="nav-link ">
                <span class="title">Form Validation</span>
            </a>
        </li>
        <li class="nav-item  ">
            <a href="form_validation_states_md.html" class="nav-link ">
                <span class="title">Material Design
                    <br>Form Validation States</span>
            </a>
        </li>
        <li class="nav-item  ">
            <a href="form_validation_md.html" class="nav-link ">
                <span class="title">Material Design
                    <br>Form Validation</span>
            </a>
        </li>
        <li class="nav-item  ">
            <a href="form_layouts.html" class="nav-link ">
                <span class="title">Form Layouts</span>
            </a>
        </li>
        <li class="nav-item  ">
            <a href="form_input_mask.html" class="nav-link ">
                <span class="title">Form Input Mask</span>
            </a>
        </li>
        <li class="nav-item  ">
            <a href="form_editable.html" class="nav-link ">
                <span class="title">Form X-editable</span>
            </a>
        </li>
        <li class="nav-item  ">
            <a href="form_wizard.html" class="nav-link ">
                <span class="title">Form Wizard</span>
            </a>
        </li>
        <li class="nav-item  ">
            <a href="form_icheck.html" class="nav-link ">
                <span class="title">iCheck Controls</span>
            </a>
        </li>
        <li class="nav-item  ">
            <a href="form_image_crop.html" class="nav-link ">
                <span class="title">Image Cropping</span>
            </a>
        </li>
        <li class="nav-item  ">
            <a href="form_fileupload.html" class="nav-link ">
                <span class="title">Multiple File Upload</span>
            </a>
        </li>
        <li class="nav-item  ">
            <a href="form_dropzone.html" class="nav-link ">
                <span class="title">Dropzone File Upload</span>
            </a>
        </li>
    </ul>
</li>

這段代碼僅僅只是對(duì)Elements的實(shí)現(xiàn)。
如果在網(wǎng)站中導(dǎo)航欄的內(nèi)容比較多航唆, 按照Metronic的實(shí)現(xiàn)方式才漆, 代碼的可維護(hù)性不會(huì)太好。
那么這個(gè)問(wèn)題佛点, 在Django的生態(tài)中醇滥,有沒(méi)有好的解決方法呢?

Sitetree介紹

經(jīng)過(guò)搜索超营, 在Django中有許多可以實(shí)現(xiàn)導(dǎo)航欄的插件鸳玩。 在本文中將講述如何集成Sitetree插件。
Sitetree的github傳送門(mén)在此sitetree's github,官網(wǎng)的自我介紹如下:

django-sitetree is a reusable application for Django, introducing site tree
menu and breadcrumbs navigation elements.

官網(wǎng)也有對(duì)如何使用的介紹演闭,文檔傳送門(mén)
雖然官網(wǎng)文檔在手不跟, 但是剛接觸的同學(xué)想要順利的使用起來(lái)可能也會(huì)遇到一些問(wèn)題。 通過(guò)百度搜索也發(fā)現(xiàn)相關(guān)的中文資料比較少米碰。 因而特此記錄窝革,希望對(duì)大家有所幫助。

使用步驟
1. Sitetree安裝

據(jù)官網(wǎng)中的的INSTALL文件吕座, 有兩種安裝方法虐译,一種是

  pip install django-sitetree

另外一種是下載源碼, 在源碼目錄中使用命令:

  pip install .

我在安裝的過(guò)程中吴趴, 使用第一個(gè)命令并沒(méi)有安裝成功漆诽。 索性就從github中下載了v1.9.0源碼, 使用第二個(gè)命令安裝成功。

2. 例子

關(guān)于Django使用sitetree的中文資料比較少厢拭, 還好下載了源碼兰英, 在源碼目錄中,看到了有Demo工程供鸠。
進(jìn)入Demo工程畦贸,使用

  python manage.py runserver

就可以成功運(yùn)行, 可以看到sitetree支持bootstrap2/3/4楞捂,選擇主題為bootstrap3之后薄坏, 效果如下圖所示:


sitetree官方Demo

既然Demo跑起來(lái)了鼻忠, 我們依葫蘆畫(huà)瓢就好

3. 使用

修改項(xiàng)目配置
在Django 1.11版本下涵但,只需要在setting文件中的INSTALL_APPS項(xiàng)目中加入sitetree就可以使用呢。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'sitetree',
    'users',
    'sku',
]

添加目錄結(jié)構(gòu)
在Django的admin中能看到如下界面, 就說(shuō)明sitetree已經(jīng)能正常使用呢。

sitetree使能

現(xiàn)在就可以進(jìn)入sitetree編輯頁(yè)面,根據(jù)需要編輯生成目錄結(jié)構(gòu)了祝峻,筆者編輯生成的目錄結(jié)構(gòu)如下圖:
使用sitetree編輯目錄結(jié)構(gòu)

在HTML文件中引入目錄結(jié)構(gòu)
我們這里可以參考Demo工程中的listing_bootstrap3.html的文件奥溺,就可以展示出符合bootstrap3風(fēng)格的目錄效果呢淫僻。

4. 適配Metronic模版

Sitetree的官方例子里面并沒(méi)有直接支持Metronic闸盔,但是通過(guò)對(duì)Demo例子的學(xué)習(xí),發(fā)現(xiàn)要使Sitetree能支持Metronic風(fēng)格并不難击费。
首先Sitetree在適配相關(guān)風(fēng)格的文檔快压,都是通過(guò)template文件的形式實(shí)現(xiàn)的坪郭, 比如我們要使用bootstrap3的風(fēng)格嫌松, 就需要使用諸如以下命令:

 {% sitetree_tree from "main" include "trunk" template "sitetree/menu_bootstrap3_navpills-stacked.html" %}

那我們可以看看這個(gè)menu_bootstrap3_navpills-stacked.html文件的內(nèi)容是什么?
在安裝Sitetree之后育灸,系統(tǒng)路徑是

/Library/Python/2.7/site-packages/sitetree/

Python的版本不同砸喻, 路徑會(huì)各不相同愉适。
在該路徑下存在templates/sitetree目錄惠爽。 Django在startserver的時(shí)候, 本目錄會(huì)成為系統(tǒng)搜索templates文件的默認(rèn)目錄之一。
讓我們看一下該文件的內(nèi)容:

{% load sitetree %}
<ul class="nav nav-pills nav-stacked">
    {% for item in sitetree_items %}
        <li {% if item.is_current or item.in_current_branch %}class="active"{% endif %}>
            <a href="{% sitetree_url for item %}">{{ item.title_resolved }}</a>
        </li>
    {% endfor %}
</ul>

代碼邏輯很簡(jiǎn)單, 而且從該文件我們發(fā)現(xiàn)人弓,該實(shí)現(xiàn)只支持一級(jí)目錄沼死, 如果我們的目錄結(jié)構(gòu)存在2級(jí)以上,就不能正確的顯示意蛀。
但是健芭,我們發(fā)現(xiàn)Demo工程的頂部導(dǎo)航欄是支持多級(jí)目錄結(jié)構(gòu)的, 那讓我們看看頂部導(dǎo)航欄的template文件內(nèi)容

{% load sitetree %}
<ul class="nav navbar-nav">
    {% for item in sitetree_items %}
        <li class="{% if item.has_children %}dropdown{% endif %} {% if item.is_current or item.in_current_branch %}active{% endif %}">
            <a href="{% if item.has_children %}#{% else %}{% sitetree_url for item %}{% endif %}" {% if item.has_children %}class="dropdown-toggle" data-toggle="dropdown"{% endif %}>
                {{ item.title_resolved }}
                {% if item.has_children %}<b class="caret"></b>{% endif %}
            </a>
            {% if item.has_children %}
                {% sitetree_children of item for menu template "sitetree/menu_bootstrap3_dropdown.html" %}
            {% endif %}
        </li>
    {% endfor %}
</ul>

可以看到,該文件有類似 if item.has_children的判斷邏輯,因此該模板文件是支持多級(jí)結(jié)構(gòu)的(至少是2級(jí),3級(jí)沒(méi)有嘗試)代乃。 所以我們參考該文件編碼旬牲,既可以使得sitetree能使用Metronic的風(fēng)格吭历。

新增menu_metronic.html模版文件堕仔,內(nèi)容是

{% load static   %}
{% load sitetree %}

<div class="page-sidebar-wrapper">
    <div class="page-sidebar navbar-collapse collapse">
        <ul class="page-sidebar-menu   " data-keep-expanded="false" data-auto-scroll="true" data-slide-speed="200">
            {% for item in sitetree_items %}
            <li class="nav-item">
                <a href="javascript:;" class="nav-link nav-toggle">
                    <span class="title">{{ item.title_resolved }}</span>
                    {% if item.has_children %}
                    <span class="arrow"></span>
                    {% endif %}
                </a>
                {% if item.has_children %}
                {% sitetree_children of item for menu template "menu_metronic_dropdown.html" %}
                {% endif %}
            </li>
            {% endfor %}
        </ul>
    </div>
</div>

新增menu_metronic_dropdown.html模版文件,內(nèi)容是

{% load static   %}
{% load sitetree %}
<ul class="sub-menu">
    {% for item in sitetree_items %}
        <li class ="nav-item">
            <a href="{% sitetree_url for item %"} class = "nav-link">
                <span class="title">{{ item.title_resolved }}</span>
            </a>
        </li>
    {% endfor %}
</ul>

目前我們有了兩個(gè)針對(duì)metronic模版的文件晌区, 只需要把這兩個(gè)文件放置在工程默認(rèn)的template目錄下摩骨, 系統(tǒng)即可找到。

在頁(yè)面的HTML文件中朗若, 在放置側(cè)邊導(dǎo)航欄的位置恼五,使用以下內(nèi)容就可以導(dǎo)入我們?cè)赼dmin面板中編輯的目錄結(jié)構(gòu)呢。

{% sitetree_menu from "maintree" include "trunk" template "menu_metronic.html" %}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哭懈,一起剝皮案震驚了整個(gè)濱河市灾馒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌遣总,老刑警劉巖睬罗,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異旭斥,居然都是意外死亡容达,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)垂券,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)花盐,“玉大人,你說(shuō)我怎么就攤上這事菇爪∷阈荆” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵娄帖,是天一觀的道長(zhǎng)也祠。 經(jīng)常有香客問(wèn)我,道長(zhǎng)近速,這世上最難降的妖魔是什么诈嘿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任堪旧,我火速辦了婚禮,結(jié)果婚禮上奖亚,老公的妹妹穿的比我還像新娘淳梦。我一直安慰自己,他們只是感情好昔字,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布爆袍。 她就那樣靜靜地躺著,像睡著了一般作郭。 火紅的嫁衣襯著肌膚如雪陨囊。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天夹攒,我揣著相機(jī)與錄音蜘醋,去河邊找鬼。 笑死咏尝,一個(gè)胖子當(dāng)著我的面吹牛压语,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播编检,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼胎食,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了允懂?” 一聲冷哼從身側(cè)響起厕怜,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎累驮,沒(méi)想到半個(gè)月后酣倾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谤专,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年躁锡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片置侍。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡映之,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜡坊,到底是詐尸還是另有隱情杠输,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布秕衙,位于F島的核電站蠢甲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏据忘。R本人自食惡果不足惜鹦牛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一搞糕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧曼追,春花似錦窍仰、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至晶伦,卻和暖如春碟狞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坝辫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工篷就, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人近忙。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像智润,于是被迫代替她去往敵國(guó)和親及舍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容