在這一節,咱們將學習如何用自動腳原本添加內容,而後給咱們的應用添加首頁和一個內容頁。html
9.Part1練習答案python
我想仍是直接用分類名稱來做爲連接的一部分會比較好一些,好比用/rango/category/Python/來訪問Python分類這樣子。但碰到帶空格的分類名稱時,連接中的空格會被自動轉義,所以,用一個別名來做爲連接更爲理想。 數據庫
Django中有一個slugify的方法,它能夠把幫助咱們自動處理別名,好比咱們的分類名是」how do i create a slug in django「,slugify會把它變成」how-do-i-create-a-slug-in-django「。django
編輯rango/models.py文件,修改Category類:flask
rango/models.py:瀏覽器
from django.template.defaultfilters import slugify class Category(models.Model): name = models.CharField(max_length=128, unique=True) views = models.IntegerField(default=0) likes = models.IntegerField(default=0) slug = models.SlugField(unique=True) def save(self, *args, **kwargs): self.slug = slugify(self.name) super(Category, self).save(*args, **kwargs) def __str__(self): return self.name
而後依次在dos命令提示符下運行以下命令:服務器
$ python manage.py makemigrations rango
$ python manage.py migrate
注意:在model.py中對模型中的字段進行修改後,必須執行上述命令才能把數據庫跟着改動。ide
加入slug字段後,咱們但願在管理界面中輸入分類名稱時,自動生成slug字段,這個能夠經過修改admin.py來實現。學習
編輯rango/admin.py 文件,讓它變成下面這個樣子:測試
rango/admin.py:
from django.contrib import admin from rango.models import Category, Page class PageAdmin(admin.ModelAdmin): list_display = ('title', 'category', 'url') class CategoryAdmin(admin.ModelAdmin): prepopulated_fields = {'slug':('name',)} admin.site.register(Category, CategoryAdmin) admin.site.register(Page, PageAdmin)
10.建立自動化腳本
這一次咱們再也不手動輸入內容,而是採用自動化腳本的形式:用一個腳原本自動添加內容。
在項目根文件夾下建立populate_rango.py,加入以下內容:
rangoproject/populate_rango.py:
#!/usr/bin/env python import os import django def populate(): python_cat = add_cat('Python') add_page(cat=python_cat, title="Official Python Tutorial", url="http://docs.python.org/3/tutorial/") add_page(cat=python_cat, title="How to Think like a Computer Scientist", url="http://www.greenteapress.com/thinkpython/") add_page(cat=python_cat, title="Learn Python in 10 Minutes", url="http://www.korokithakis.net/tutorials/python/") django_cat = add_cat("Django") add_page(cat=django_cat, title="Official Django Tutorial", url="https://docs.djangoproject.com/en/1.7/intro/tutorial01/") add_page(cat=django_cat, title="Django Rocks", url="http://www.djangorocks.com/") add_page(cat=django_cat, title="How to Tango with Django", url="http://www.tangowithdjango.com/") frame_cat = add_cat("Other Frameworks") add_page(cat=frame_cat, title="Bottle", url="http://bottlepy.org/docs/dev/") add_page(cat=frame_cat, title="Flask", url="http://flask.pocoo.org") # 輸出咱們添加的內容. for c in Category.objects.all(): for p in Page.objects.filter(category=c): print ("- {0} - {1}".format(str(c), str(p))) def add_page(cat, title, url, views=0): p = Page.objects.get_or_create(category=cat, title=title, url=url, views=views)[0] return p def add_cat(name): c = Category.objects.get_or_create(name=name, defaults=None)[0] return c # 開始執行! if __name__ == '__main__': print ("開始執行Rango自動化腳本...") os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'rangoproject.settings') django.setup() from rango.models import Category, Page populate()
咱們來運行這個腳本,在dos命令提示符下輸入命令:
python populate_rango.py
你會看到象這樣的提示:
開始執行Rango自動化腳本... - Python - Official Python Tutorial - Python - How to Think like a Computer Scientist - Python - Learn Python in 10 Minutes - Django - Official Django Tutorial - Django - Django Rocks - Django - How to Tango with Django - Other Frameworks - Bottle - Other Frameworks - Flask
這個腳本自動往數據庫裏添加了三個分類,並在各個分類下添加了數量不等的頁面數據。
咱們來看一下這些數據添加後的效果。從新啓動Django服務器,而後在瀏覽器地址欄裏輸入:
http://127.0.0.1:8000/admin/
按回車進入登陸頁面,輸入帳號和密碼,登陸成功後,點擊連接「Pages」,可看到以下頁面:
寫這樣一個腳本雖然要花上一點時間,但你如果在一個團隊中作這個項目,你能夠把這個腳本分發給團隊中的其餘人,那樣,他們就能夠很快建立好數據庫。此外,這個腳本在測試中亦會派上用場。
11.在首頁上顯示分類
咱們來回顧一下,要完成某頁面顯示,須要作哪些操做?
下面咱們來一一完成。先編輯rango/views.py 文件,讓它變成下面這樣:
rango/views.py:
from django.shortcuts import render from rango.models import Category def index(request): # 查詢數據庫中的全部分類; # 用likes字段排序; # 只顯示前5個字段; # 把列表存入context_dict字典,再把這個字典傳給模板引擎; category_list = Category.objects.order_by('-likes')[:5] context_dict = {'categories': category_list} # 把context_dict字典傳給模板引擎; return render(request, 'rango/index.html', context_dict)
接下來咱們來編輯首頁模板,在templates文件夾(位於項目根文件夾下)中建立一個rango文件夾,而後在該文件夾下新建一個index.html文件,加入以下內容:
rangoproject/templates/rango/index.html:
<!DOCTYPE html> <html> <head> <title>Rango</title> </head> <body> <h1>歡迎來到Rango!</h1> {% if categories %} <ul> {% for category in categories %} <li>` category`.`name `</li> {% endfor %} </ul> {% else %} <strong>目前尚未可用分類。</strong> {% endif %} </body> </html>
Tips:建議把全部的模板文件儲存爲UTF-8編碼。
在{% if categories %} 這個語句中的categories ,就是咱們視圖裏context_dict字典的數據,「if」是用來判斷它是否存在。若存在,則用「for」語句把它逐條取出來——由於categories 是一個列表。
最後咱們來設計URL,在rango文件夾下建立一個叫url.py的文件,而後添加以下內容:
rango/urls.py :
from django.conf.urls import patterns, url from rango import views urlpatterns = patterns('', url(r'^$', views.index, name='index'))
編輯rangoproject/urls.py 文件,讓它變成下面這樣:
rangoproject/urls.py :
from django.conf.urls import patterns, include, url from django.contrib import admin urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)), url(r'^rango/', include('rango.urls')), )
好了,讓咱們在瀏覽器中訪問一下http://127.0.0.1:8000/rango/,你會看到這樣的頁面:
12.建立內容頁
如今,分類是顯示出來了,咱們還但願用戶進入分類後,能看到每一個分類裏的內容。
先編寫視圖,編輯rango/views.py 文件,先在頭部加入一行:
rango/views.py:
from rango.models import Page
而後加入以下內容:
rango/views.py:
def category(request, category_name_slug): # 定義要傳遞給模板引擎的context_dict字典。 context_dict = {} try: # 是否能匹配到給定的分類別名? # 若是匹配不到,.get() 方法會提交一個DoesNotExist的異常; # 匹配到的話,咱們就用它來在Page表中檢索出該分類的數據; category = Category.objects.get(slug=category_name_slug) context_dict['category_name'] = category.name # 獲取該分類下的全部頁面; pages = Page.objects.filter(category=category) # 把獲取到的數據存入context_dict; context_dict['pages'] = pages # 咱們把分類名稱也加入到context_dict中,這個值可用來在模板中校驗分類是否存在。 context_dict['category'] = category except Category.DoesNotExist: # 若是找不到分類,那麼啥都不作; # 模板會顯示「沒有分類」的信息; pass return render(request, 'rango/category.html', context_dict)
如今咱們來建立模板,在templates/rango文件夾下新建一個category.html文件,加入如入內容:
rangoproject/templates/rango/category.html:
<!DOCTYPE html> <html> <head> <title>Rango</title> </head> <body> <h1>` category_name `</h1> {% if category %} {% if pages %} <ul> {% for page in pages %} <li><a href="` page`.`url `">` page`.`title `</a></li> {% endfor %} </ul> {% else %} <strong>當前分類下尚無可用頁面.</strong> {% endif %} {% else %} 指定的分類名稱 ` category_name ` 不存在! {% endif %} </body> </html>
接下來咱們從新設計URL,編輯rango/url.py的文件,把它變成下面這樣:
rango/urls.py :
from django.conf.urls import patterns, url from rango import views urlpatterns = patterns('', url(r'^$', views.index, name='index'), url(r'^category/(?P<category_name_slug>[\w\-]+)/$', views.category, name='category'), )
除了這些,咱們還須要修改一下首頁的模板,讓分類名稱加上連接。編輯index.html,把它改爲這樣:
rangoproject/templates/rango/index.html:
<!DOCTYPE html> <html> <head> <title>Rango</title> </head> <body> <h1>歡迎來到Rango!</h1> {% if categories %} <ul> {% for category in categories %} <!-- 下面這行給分類加入了超連接 --> <li><a href="/rango/category/` category`.`slug `">` category`.`name `</a></li> {% endfor %} </ul> {% else %} <strong>目前尚未可用分類。</strong> {% endif %} </body> </html>
咱們來檢查一下工做成果
咱們先訪問首頁,你會看到首頁中列出了當前全部的分類,這些分類都是超連接。咱們點擊「Django」分類,這樣,Django分類中的全部頁面都顯示出來了,點擊「Official Django Tutorial」連接,它將會把咱們帶到Django官方實例的頁面。
13.練習
1)建立一個」about」視圖,關聯的模板文件爲about.html;
2)模板的標題叫「關於Rango」,可自由添加一些文字,但須要插入一個叫rango.jpg的圖片(圖片下載地址請看part1),圖片存放在static文件夾下。
【未完待續】