鍍金池/ 教程/ Python/ 動態(tài)URL
更上一層樓
歸檔, AboutMe和標(biāo)簽分類
動態(tài)URL
Django簡介
Models
項目與APP
Template
開發(fā)環(huán)境和Django安裝
多說,markdown和代碼高亮
Admin
Views和URL
搜索和ReadMore
RSS和分頁

動態(tài)URL

運行已經(jīng)做好的博客框架, 會發(fā)現(xiàn)一個問題, 只有一個主頁的空盒子, 而大部分時候我們希望能夠讓每篇博客文章都有一個獨立的頁面.

我第一個想到的方法是給每篇博客文章加一個view函數(shù)邏輯, 然后設(shè)置一個獨立的url(我不知道語言比如PHP, 或者web框架rail等是如果解決的, 我是第一次仔細(xì)的學(xué)習(xí)web框架, 也沒有前端開發(fā)經(jīng)驗), 但是這種方法耦合性太強, 而且用戶不友好, 缺點非常多

Django給我們提供了一個方便的解決方法, 就是動態(tài)URL

現(xiàn)在修改my_blog/article/views.py代碼:

# -*- coding: utf-8 -*-
from django.shortcuts import render
from django.http import HttpResponse
from article.models import Article
from datetime import datetime
from django.http import Http404

# Create your views here.
def home(request):
    post_list = Article.objects.all()  #獲取全部的Article對象
    return render(request, 'home.html', {'post_list' : post_list})

def detail(request, id):
    try:
        post = Article.objects.get(id=str(id))
    except Article.DoesNotExist:
        raise Http404
    return render(request, 'post.html', {'post' : post})

因為id是每個博文的唯一標(biāo)識, 所以這里使用id對數(shù)據(jù)庫中的博文進行查找

在my_blog/my_blog/urls.py中修改url設(shè)置:

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

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'my_blog.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    url(r'^admin/', include(admin.site.urls)),
    url(r'^$', 'article.views.home', name = 'home'),
    url(r'^(?P<id>\d+)/$', 'article.views.detail', name='detail'),
)

然后在templates下建立一個用于顯示單頁博文的界面:

#post.html
{% extends "base.html" %}

{% block content %}
<div class="posts">
        <section class="post">
            <header class="post-header">
                <h2 class="post-title">{{ post.title }}</h2>

                    <p class="post-meta">
                        Time:  <a class="post-author" href="#">{{ post.date_time|date:"Y /m /d"}}</a> <a class="post-category post-category-js" href="#">{{ post.category }}</a>
                    </p>
            </header>

                <div class="post-description">
                    <p>
                        {{ post.content }}
                    </p>
                </div>
        </section>
</div><!-- /.blog-post -->
{% endblock %}

可以發(fā)現(xiàn)只需要對home.html進行簡單的修改, 去掉循環(huán)就可以了.

修改home.html和base.html, 加入動態(tài)鏈接和主頁, 歸檔, 專題和About Me按鈕

<!--home.html-->
{% extends "base.html" %}

{% block content %}
<div class="posts">
    {% for post in post_list %}
        <section class="post">
            <header class="post-header">
                <h2 class="post-title"><a href="{% url "detail" id=post.id %}">{{ post.title }}</a></h2>

                    <p class="post-meta">
                        Time:  <a class="post-author" href="#">{{ post.date_time |date:"Y /m /d"}}</a> <a class="post-category post-category-js" href="#">{{ post.category }}</a>
                    </p>
            </header>

                <div class="post-description">
                    <p>
                        {{ post.content }}
                    </p>
                </div>
                <a class="pure-button" href="{% url "detail" id=post.id %}">Read More >>> </a>
        </section>
    {% endfor %}
</div><!-- /.blog-post -->
{% endblock %}
<!--base.html-->
<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="A layout example that shows off a blog page with a list of posts.">

    <title>Andrew Liu Blog</title>
    <link rel="stylesheet" >
    <link rel="stylesheet" >
    <link rel="stylesheet" >

</head>
<body>
<div id="layout" class="pure-g">
    <div class="sidebar pure-u-1 pure-u-md-1-4">
        <div class="header">
            <h1 class="brand-title"><a href="{% url "home" %}">Andrew Liu Blog</a></h1>
            <h2 class="brand-tagline">雪憶 - Snow Memory</h2>
            <nav class="nav">
                <ul class="nav-list">
                    <li class="nav-item">
                        <a class="button-success pure-button" href="/">主頁</a>
                    </li>
                    <li class="nav-item">
                        <a class="button-success pure-button" href="/">歸檔</a>
                    </li>
                    <li class="nav-item">
                        <a class="pure-button" >Github</a>
                    </li>
                    <li class="nav-item">
                        <a class="button-error pure-button" >Weibo</a>
                    </li>
                    <li class="nav-item">
                        <a class="button-success pure-button" href="/">專題</a>
                    </li>
                    <li class="nav-item">
                        <a class="button-success pure-button" href="/">About Me</a>
                    </li>
                </ul>
            </nav>
        </div>
    </div>

    <div class="content pure-u-1 pure-u-md-3-4">
        <div>
            {% block content %}
            {% endblock %}
            <div class="footer">
                <div class="pure-menu pure-menu-horizontal pure-menu-open">
                    <ul>
                        <li><a >About Me</a></li>
                        <li><a >Twitter</a></li>
                        <li><a >GitHub</a></li>
                    </ul>
                </div>
            </div>
        </div>
    </div>
</div>

</body>
</html>

其中主要改動

  • 添加了幾個導(dǎo)航按鈕, 方便以后添加功能(暫時不添加登陸功能)
  • 添加read more按鈕
  • 在博客文章的增加一個鏈接, 鏈接的href屬性為{% url "detail" id=post.id %}, 當(dāng)點擊這個文章題目時, 會將對應(yīng)的數(shù)據(jù)庫對象的id傳入的url中, 類似于url傳參, 不記得的同學(xué)可以重新回到前幾頁翻一下. 這里將數(shù)據(jù)庫對象唯一的id傳送給url設(shè)置, url取出這個id給對應(yīng)的view中的函數(shù)邏輯當(dāng)做參數(shù). 這樣這個id就傳入對應(yīng)的參數(shù)中被使用

比如: 點擊到的博客文章標(biāo)題的對象對應(yīng)的id=2, 這個id被傳送到name=detail的url中, '^(?P<id>\d+)/$'正則表達式匹配后取出id, 然后將id傳送到article.views.detail作為函數(shù)參數(shù), 然后通過get方法獲取對應(yīng)的數(shù)據(jù)庫對象, 然后對對應(yīng)的模板進行渲染, 發(fā)送到瀏覽器中..

此時重新運行服務(wù)器, 然后在瀏覽器中輸入http://127.0.0.1:8000/點擊對應(yīng)的博客文章題目, 可以成功的跳轉(zhuǎn)到一個獨立的頁面中

http://wiki.jikexueyuan.com/project/django-set-up-blog/images/68.png" alt="博客" />