實戰Django:Rango Part2

 

在這一節,咱們將學習如何用自動腳原本添加內容,而後給咱們的應用添加首頁和一個內容頁。html

9.Part1練習答案python


除了加入views和likes兩個字段,這裏咱們須要思考一個問題,用戶將如何來訪問咱們的頁面?用 /rango/category/1//rango/category/2/?他們怎麼知道1表明哪一個分類,2又表明哪一個分類?有沒有更直接一點的方法呢?

我想仍是直接用分類名稱來做爲連接的一部分會比較好一些,好比用/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」,可看到以下頁面:

1

寫這樣一個腳本雖然要花上一點時間,但你如果在一個團隊中作這個項目,你能夠把這個腳本分發給團隊中的其餘人,那樣,他們就能夠很快建立好數據庫。此外,這個腳本在測試中亦會派上用場。

11.在首頁上顯示分類


咱們來回顧一下,要完成某頁面顯示,須要作哪些操做?

  • 編寫視圖
  • 建立模板
  • 設計URL

下面咱們來一一完成。先編輯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/,你會看到這樣的頁面:

2

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文件夾下。

 

【未完待續】

本文版權歸捨得學苑全部,歡迎轉載,轉載請註明做者和出處。謝謝!
做者:捨得
首發:捨得學苑@博客園

相關文章
相關標籤/搜索