實戰Django:小型CMS Part2

回顧一下咱們以前講過的幾個實例的流程,如今,咱們只要添加一些內容(用來測試),建立視圖、模板和URL模式,就能完成這個小型的CMS了。css

 

7.添加內容 html


咱們先來建立一個分類,點擊Categories後面的「增長」按鈕,而後在Label文本框中輸入:「Django」,在slug文本框後面輸入「django」(django不用輸入也能自動出現,你能夠改爲本身喜歡的名字):算法

11

隨後點擊後面的」保存「按鈕。django

點擊左上方的」首頁「連接,返回到首頁,點擊Stories後面的「增長」按鈕,象發帖子那樣輸入一篇文章的各項內容。注意選擇Category和Owner,Status選擇」發佈「。markdown

你能夠多添加幾篇文章。架構

此外,你能夠學習一些Markdown的語法,這可能會讓你輸出的文章排版更美觀。ide

8.編寫視圖 性能


編輯cms/views.py 文件,添加下面的內容: 學習

cms/views.py測試

from django.shortcuts import render_to_response, get_object_or_404
from django.db.models import Q
from cms.models import Story, Category
from django.views import generic

class IndexView(generic.ListView):
    template_name = 'cms/story_list.html'
    context_object_name = 'story_list'
    def get_queryset(self):
        return Story.objects.all()
        
class DetailView(generic.DetailView):
    model = Story
    template_name = 'cms/story_detail.html'
    def get_queryset(self):
        return Story.objects.all()
      
def category(request, slug):
    """根據分類的別名,顯示當前分類下全部的頁面"""
    category = get_object_or_404(Category, slug=slug)
    story_list = Story.objects.filter(category=category)
    heading = "分類: %s" % category.label
    return render_to_response("cms/story_list.html", locals())
    
def search(request):
    if 'q' in request.GET:
        term = request.GET['q'].strip()
        story_list = Story.objects.filter(Q(title__contains=term) | Q(markdown_content__contains=term))
        heading = "搜索結果"
    return render_to_response("cms/story_list.html", locals())

咱們編寫了一個叫search的自定義視圖,用它來實現簡單的搜索,它並不須要一個專用的模板,咱們能夠直接把story_list.html模板拿過來重用就能夠了。搜索的算法也很簡單,只要在標題或Markdown正文中能找到經過表單提交上來的文字,那麼那個Story就是匹配的。

9.編寫模板


幾乎全部的Django項目都有一個base.html,其它的模板都由它擴展而來,這裏咱們只要擴展兩個模板就夠了:story_list.html和story_detail.html。

首先建立模板文件夾,在cms文件夾下創建templates文件夾,而後在templates下再建一個cms文件夾。

隨後咱們在這個文件夾下創建base.html文件,這個base.html文件的正確路徑應該是:

cms/templates/cms/base.html

編輯base.html文件,加入以下內容:

cms/templates/cms/base.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
    <head>
        <title>{% block title %}{% endblock %}</title>
        <style type="text/css" media="screen">
            body { color: #000; background: #fff; padding: 0 2em; margin: 0; font-family:Microsoft Yahei;  }
            h1 { color: #fff; background: #1162A0; padding: 1% 0; margin: 0;}
            h2 { color: #1162A0;  background: #aaa; border-top: 1px dotted #fff; padding: 1% 2%; margin: 0;}
            h3 { color: #1162A0; border-top: 1px dotted #fff; padding: 1% 2%; margin: 0;}
            p { margin: 1em 20 }            
            a { text-decoration: none; color: #444; }
            label { color: #444; }
            .small { font-size: 75%; color: #777; }
            #header { font-weight: bold; background: #1162A0; padding: 1% 2%; }
            #story-body { background: #ccc; padding: 2%; }
            #story-list { background: #ccc; padding: 1% 1% 1% 4%; }
            #story-list li { margin: .5em 0; }
        </style>
    </head>
    <body>
        <div id="header">
        <h1>實戰Django</h1>
            <form action="{% url 'cms-search' %}" method="get">
                <a href="{% url 'cms-home' %}">首頁</a>
                <label for="q"> &bull; 搜索:</label> <input type="text" name="q">
            </form>
        </div>
        {% block content %}
        {% endblock %}
    </body>
</html>

咱們在這個模板的頭部加入了一個搜索表單,這樣它就能響應search視圖,來完成搜索工做。

接下來是story_list.html模板,建立story_list.html文件,並加入以下代碼:

cms/templates/cms/story_list.html:

{% extends "cms/base.html" %}
{% block content %}
    {% if heading %}
        <h2>` heading `</h2>
    {% endif %}
    <ul id="story-list">
    {% for story in story_list %}
        <li><a href="` story`.`get_absolute_url `">` story`.`title `</a></li>
    {% endfor %}
    </ul>
{% endblock %}

最後建立story_detail.html模板,並加入以下代碼:

cms/templates/cms/story_detail.html:

{% extends "cms/base.html" %}
{% block title %}` story`.`title `{% endblock %}
{% block content %}
    <h2>` story`.`title `</h2>
    <h3>分類:<a href="{% url 'cms-category' story.category.slug %}">` story`.`category `</a></h3>
    <div id="story-body">
        {{ story.html_content|safe }}
    <p class="small">更新於` story`.`modified `</p>
    </div>
{% endblock %}

10.建立URL模式


在cms文件夾下建立一個叫url.py的文件,而後添加以下內容:

cms/urls.py

from django.conf.urls import patterns, url
from cms import views

urlpatterns = patterns('',
    url(r'^(?P<slug>[-\w]+)/$', views.DetailView.as_view(), name='cms-story'),
    url(r'^$', views.IndexView.as_view(), name='cms-home'),
    url(r'^category/(?P<slug>[-\w]+)/$', views.category, name='cms-category'),
    )

編輯cmsproject/urls.py 文件,讓它變成下面這樣:

cmsproject/urls.py

from django.conf.urls import patterns, include, url
from django.contrib import admin
from cms import views

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^cms/', include('cms.urls')),
    url(r'^search/$', views.search, name='cms-search'),
)

注意,咱們把search視圖掛接到了這裏。

咱們先來看一下首頁,訪問http://127.0.0.1:8000/cms/

9

點開一個文章連接,能夠看到:

12

想要完美的頁面效果,你能夠本身動手優化CSS。

點擊分類後面的連接,能夠看到相似首頁那樣的頁面。

咱們再來試一下搜索功能,在頂部的搜索框中輸入」part2」(你能夠根據你的文章標題或正文的關鍵詞來搜索),而後敲擊回車鍵,能夠看到以下頁面:

10

 

11.改進建議


CMS架構的種類很是多,你能夠根據這裏的實例進行改造,最終變成你但願的樣子。
如下是一些建議,
分頁。在只有十幾二十篇文章的時候,咱們的列表頁看着還算能夠。可是當這個數量達到成百上千,把它們所有顯示在一頁裏就有些嚇人了,並且這還可能會拖累網站的性能。一樣,若是一個搜索返回了幾百個結果,用戶也不太可能但願一次性所有看到它們。好在Django內置了一些對分頁的支持,即django.core.paginator模塊。你能夠參閱Django官方文檔來了解更多的信息。
更強大的搜索。咱們的搜索功能還算能用,可是它和咱們熟悉的Web搜索引擎比起來還差的很遠,這個搜索能夠作得功能更強大一些。
動態生成導航。咱們的CMS除了默認列出所有文章以外,沒有提供別的站點的導航方式。對一個真實的網站來講,這樣是不夠的。一種可行的辦法是在Story模型里加上一些和導航有關的變量。而更靈活的方案則是提供一個額外的導航模型,它能夠只包含三個變量:在整個導航序列裏的位置,要顯示給用戶的標籤,和一個導航對象應該指向的文章的外鍵。
用戶評論。咱們的應用程序能夠發佈內容,可是最終用戶卻沒法與咱們互動。一個可行的辦法是容許用戶評論某篇文章。這個能夠經過Django的Comments庫來實現。

 

附:本實例源代碼下載地址:捨得學苑下載中心

【The End】

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

相關文章
相關標籤/搜索