快速完成文章列表
- 創(chuàng)建一個(gè)新的小應(yīng)用 article
- 數(shù)據(jù)模式
- 管理后臺(tái): search_fields
注意:article/admin.py 里面的search_fields
不能搜索外鍵
URL配置
url --> http://xxx.xxx.xxx/article/lists/1
總url配置 myforum/urls.py
url(r'^article/', include("article.urls"))
- 有include() 交由子目錄處理
- 沒(méi)有include() 處理函數(shù)
文章 article/urls.py
url(r'^lists/(?P<block_id>\d+', "article.views.article_list", name="article_list")
- url匹配模式,固定格式,當(dāng)后面匹配url模式的話,就賦值給一個(gè)name的變量,匹配到得參數(shù)傳入后面的控制器的函數(shù)來(lái)處理
| (?P <block_id> \d+ )
| (?P <name> pattern )
注意!從html中解析url:
url(r'^lists/(?P<block_id>\d+', "article.views.article_list", name="article_list")
-
{% url 'article_list' block.id %}
通過(guò)url名稱找到了url配置,帶上block.id這個(gè)變量 - 通過(guò)url配置,把block.id的值替換
<block_id>
,解析出來(lái)一個(gè)字符串: list/(block.id)
注意!urls.py匹配url,返回頁(yè)面:
- 把url跟urls配置匹配,如果匹配的話,就交由控制器views.py處理
- 把匹配到的
<block_id>
作為參數(shù),傳到article.views.article_list
中 -
article.views.article_list
渲染出一個(gè)html
控制器 views.py
block_id
參數(shù),從urls.py匹配到的block_id
傳入 views.py 的article_list
函數(shù)進(jìn)行處理
def article_list(request, block_id):
block_id = int(block_id)
block = Block.objects.get(id=block_id)
articles = Article.objects.filter(block=block).order_by("-last_update_timestamp)
# 取出block_id 所指定的板塊,Article.block = block ,然后按更新時(shí)間倒序排列
# articles 是查詢結(jié)果集的類型
return render_to_response("article_list.html", {"articles": articles, "block": block})
# 返回一個(gè)網(wǎng)頁(yè),給網(wǎng)頁(yè)傳入兩個(gè)參數(shù)articles和block
- objects.get() 取一個(gè)記錄,要求返回的結(jié)果,有且只有一個(gè)結(jié)果!
- objects.filter() 取多個(gè)記錄,按過(guò)濾條件進(jìn)行篩選
- objects.all() 取所有記錄
模板templates
bootstap 簡(jiǎn)要
jumbotron, 面包屑(breadcrumb)
<div class="jumbotron">...</div>
面包屑(breadcrumb)
<ol class="breadcrumb">
<li><a href="{% url 'block_list' %}"></a></li>
<li class="active">{{ block.name }}</li>
</ol>
- ol 有序列表,orderlist
- {% xxxx xxxx %} django語(yǔ)法固定格式
templates標(biāo)簽
URL名稱
url(r'^lists/(?P<block_id>\d+', "article.views.article_list", name="article_list")
# article/urls.py 里面的name就是URL名稱
url(r'^$', "block.views.block_list", name="block_list")
# forum/urls.py 里面的name就是url名稱
# 這個(gè)url沒(méi)有任何的參數(shù),因?yàn)閡rl沒(méi)有匹配任何的模式,同時(shí)在控制器函數(shù)里面,除了request之外,也沒(méi)有其他的參數(shù)
django語(yǔ)法:url "URL名稱" 位置參數(shù) 關(guān)鍵字參數(shù)=值|date:"Y-m-d P"
{% url "article_list" block.id %} # 跳轉(zhuǎn)到 http://xxx/lists/<block_id>
- 使用url模板標(biāo)簽反解析參數(shù),不需要寫(xiě)死跳轉(zhuǎn)頁(yè)面,更加靈活。
- | 過(guò)濾器 date:"Y-m-d P" 格式化時(shí)間
對(duì)于choices枚舉的django字段,
get_變量名_status
,把漢字說(shuō)明輸出出來(lái)
{{ article.get_status_display }}
html模板的繼承,整合html代碼到base.html
/templates/base.html 把html相同的部分拿出來(lái)。
模板 塊標(biāo)簽
{% block content %} {% endblock %}
- block, endblock 塊標(biāo)簽開(kāi)始和結(jié)束的標(biāo)示
- content 快標(biāo)簽的名字
子模板,
block/templates/block_list.html
,article/templates/article_list.html
{% extends "base.html" %} # 必須是第一行
{% block conten %}
...
{% endblock %}
django是如何找打base.html的呢?
在myforum/setting.py中
TEMPLATES = [
{ ...
'DIRS': [ os.path.join(BASE_DIR, "templates" ],
...
}
]
bootstrap 下拉框 需要引入jQuery 和 javascript
<script src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>