一.結合模型,視圖和模板
1.數據和模板結合
基本工作流程:
(1)在views.py文件中導入我們創建的models
(2)在視圖函數中使用models,進行crud操作。
(3)將取得的數據存入template的上下文
(4)在template中給我們的數據找好位置,渲染它們。
2.初探模板語言
{% if %}
{% endif %}
if語句,和普通使用的不同在於必須用{% %} 包裹,而且當結束時有一個{% endif %}
{% for %}
{% endfor %}
for語句同理亦然。
{{data}},在兩層大括號的包裹中,存放的是數據,可以通過if,for等分支,循環語句,將list中的數據取出來。
3.如何設計URL
我們的rango應用下有許多的頁面,url的名稱設計也是一個頗為重要的任務。如果url過於模糊,例如/rango/1或者/rango/2可能連我們自己都會不知所雲。如果在url上添加頁面的相關信息就好的多了,比如/rango/python,這是一個和python相關的頁面。
並且python是從數據庫中取出的相關字段。那么一個字段有空格又怎么辦呢?比如
python framework。這就需要用到slug字段了。它會將python framework轉換成python-framework.
3.Slug
首先引入slugify函數
from django.template.default.defaultfilters import slugify
在model中添加slug字段
slug=models.SlugField(unique=True)
重寫save函數
ef save(*args,**kwargs):
self.slug=slugify(self.name)
super(<model-name>,self).save(*args,**kwargs)
4.注意事項
由於我們設置的slug是一個必須的(unique)值,如果要對model的改動遷移,會報如下的錯誤:
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows)
2) Quit, and let me add a default in models.py
解決方案:選擇1,輸入' '即可,這表示將字段默認值設置為空字符串,但是接下來的步驟還是會報錯
django.db.utils.IntegrityError: UNIQUE constraint failed: rango_category__new.slug
解決方案詳細:http://stackoverflow.com/questions/29373887/django-db-utils-integrityerror-unique-constraint-failed-rango-category-new-sl
給slug字段添加一個默認值uuid,還是失敗
真-解決方案:
http://www.cnblogs.com/FARAMIR/p/4632355.html
由此可見,教程也不是完全正確,必須要不斷的折騰才行。
PS:mysql就是比sqlite好用。
5.詳細頁面
我們的首頁只有分類,點擊分類后才進入詳細頁面。詳細頁面顯示的就是page的信息,所以要引入page的model
要進入詳細頁面,勢必要設置url
url設置如下:
url(r'^category/(?P<category_name_slug>[\w\-]+)/$', views.category, name='category')
?P<category_name_slug>代表將這個值作為參數傳入到category這個視圖函數中,后面的正則表達式[\w\-]+代表匹配slug值
在視圖函數中要接收這個值的話就要新增參數
def category(request,category_name_slug)
因為已經設置slug值為unique,所以通過slug值我們可以找到唯一的Category對象,通過這個對象再找到page對象們。將信息存入context_dict{},在模版中渲染數據即可