django 簡易博客開發 2 模板和數據查詢


首先還是貼一下項目地址  https://github.com/goodspeedcheng/sblog   因為代碼全在上面

上一篇博客我們介紹了 django的安裝配置,新建project,新建app,app配置以及admin的使用,現在讓我們來了解一下模板的使用和模型數據的顯示。

1、首先介紹如何在視圖中使用模板

方法1

from django.template import Template, Context
from django.http import HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    t = Template("<html><body>It is now {{ current_date }}.</body></html>")
    html = t.render(Context({'current_date': now}))
    return HttpResponse(html)

它使用了模板系統,但是模板仍然嵌入在Python代碼里,並未真正的實現數據與表現的分離。 現在讓我們將模板置於一個 單獨的文件 中,並且讓視圖加載該文件來解決此問題。

方法2

首先在項目目錄下新建templates文件夾 然后在templates下新建sblog文件夾和base.html文件

目錄結構為

templates/
  -sblog/
  -base.html

然后修改setting.py

TEMPLATE_DIRS = (
    '/home/gs/blog/templates',  #替換成自己的templates目錄 這里用的是絕對路徑,也可以改成相對路徑
    '/home/gs/blog/templates/sblog',
)

編寫base.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>
        {% block title %}{% endblock %}        
    </title>
</head>

<body>
    <h1>a simple blog</h1>
    {% block content %}
    {% endblock %}
    {% block footer %}
    {# 任何每個頁面都可能修改的文本區域的頁腳 #}
        <p>Thanks for visiting my site! </p>
    {% endblock %}
</body>
</html>

這個叫做 base.html 的模板定義了一個簡單的 HTML 框架文檔,我們將在本站點的所有頁面中使用。 所有的子模板都在重載、添加或保留base.html塊的內容。

{% block %}: 所有的 {% block %} 標簽告訴模板引擎,子模板可以重載這些部分。 每個{% block %}標簽所要做的是告訴模板引擎,該模板下的這一塊內容將有可能被子模板覆蓋。

然后在sblog目錄下新建blog_list.html 添加以下內容

{% extends "base.html" %}

{% block title %} blog list {% endblock %}


{% block content %}
<div class="content">
    {% for blog in blogs %}
        <h3>{{ blog.caption }}</h3>
        <div>{{ blog.content}} </div> 
    {% endfor %}     
</div>    
{% endblock %}

templates 標簽使用 參見文檔 :https://docs.djangoproject.com/en/1.4/topics/templates/

在sblog目錄下views.py文件添加 內容

from django.shortcuts import render_to_response
from sblog.models import Blog


def blog_list(request):
    blogs = Blog.objects.all()
    return render_to_response("blog_list.html", {"blogs": blogs})

當然,你也可以先修改視圖再添加模板

現在視圖和模板都完成了,讓我們添加url吧

首先修改blog目錄下urls.py 文件 添加 

urlpatterns += patterns((''),
    (r'^sblog/', include('sblog.urls')),
)

然后修改sblog目錄下urls.py文件 添加

#!/usr/bin/python
# -*- coding: utf-8 -*-

from django.conf.urls import *


urlpatterns = patterns(('sblog.views'),
    url(r'^bloglist/$', 'blog_list', name='bloglist'), 
# name屬性是給這個url起個別名,可以在模版中引用而不用擔心urls文件中url的修改 引用方式為{% url bloglist %} )

現在 讓我們打開 http://127.0.0.1:8080/sblog/bloglist/  在admin下添加的博客是不是顯示出來了呢

這里8080 端口是我自己設置的 默認是情況下8000

 

當然你也可以自己添加顯示的內容 比如 tag author publish_time

以上步驟不分先后,因為必須全部完成后才能在瀏覽器中顯示

2、數據查詢與過濾

因為我們只是操作數據可以在終端操作  在終端打開項目目錄 輸入 python manage.py shell “manager.py shell” 命令是啟用Python交互解釋器的一種方法 這個方法在這里是很有必要的,因為Django可以通過它知曉數據庫連接信息的配置文件。

In [1]: from sblog.models import Blog

現在就可以進行數據操作,因為數據想較多,我們在這里只進行查詢過濾操作

Blog.objects.all()  # 選擇全部對象
Blog.objects.filter(caption='blogname')  # 使用 filter() 按博客題目過濾
Blog.objects.filter(caption='blogname', id="1") # 也可以多個條件
#上面是精確匹配 也可以包含性查詢
Blog.objects.filter(caption__contains='blogname')

Blog.objects.get(caption='blogname') # 獲取單個對象 如果查詢沒有返回結果也會拋出異常

#數據排序
Blog.objects.order_by("caption")
Blog.objects.order_by("-caption")  # 倒序

#如果需要以多個字段為標准進行排序(第二個字段會在第一個字段的值相同的情況下被使用到),使用多個參數就可以了
Blog.objects.order_by("caption", "id")

#連鎖查詢
Blog.objects.filter(caption__contains='blogname').order_by("-id")

#限制返回的數據
Blog.objects.filter(caption__contains='blogname')[0]
Blog.objects.filter(caption__contains='blogname')[0:3]  # 可以進行類似於列表的操作

每次都要用 order_by() 顯得有點啰嗦。 大多數時間你通常只會對某些 字段進行排序。 在這種情況下,Django讓你可以指定模型的缺省排序方式:

修改 models.py

class Blog(models.Model):
    """docstring for Blogs"""
    caption = models.CharField(max_length=50)
    author = models.ForeignKey(Author)
    tags = models.ManyToManyField(Tag, blank=True)
    content = models.TextField()
    publish_time = models.DateTimeField(auto_now_add=True)
    update_time = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return u'%s %s %s' % (self.caption, self.author, self.publish_time)

    class Meta:
        ordering = ['-publish_time']

 

3、添加博客展示頁面

在sblog目錄下添加blog_show.html 文件,添加以下內容

{% extends "base.html" %}

{% block title %} {{ blog.caption }} {% endblock %}


{% block content %}
<div class="content">
  <h2>blog show</h2> <h4>{{ blog.caption }}</h4> <div>{{ blog.content }} </div> </div> {% endblock %}

views.py 添加blog_show 視圖

from django.http import Http404

def blog_show(request, id=''):
    try:
        blog = Blog.objects.get(id=id)
    except Blog.DoesNotExist:
        raise Http404
    return render_to_response("blog_show.html", {"blog": blog})

修改sblog下urls.py (如果不特殊說明,以后修改urls.py文件默認就是sblog目錄下的)添加以下內容

url(r'^blog/(?P<id>\d+)/$', 'blog_show', name='detailblog'),

修改blog_list.html

<h3>{{ blog.caption }}</h3>

改為

<h3><a href="{% url detailblog blog.id %}">{{ blog.caption }}</a></h3>
{% url detailblog blog.id %} 中 blog.id 是
url(r'^blog/(?P<id>\d+)/$', 'blog_show', name='detailblog'),

的 (?P<id>\d+) 參數

現在刷新以下bloglist頁面 博客標題是不是變成鏈接了呢,點擊查看一下吧.。

當然現在這個界面確實丑的一塌糊塗,好吧我承認這個根本就不配叫做有界面,大家還是自己修改一下吧。

 

最后源代碼可以在  https://github.com/goodspeedcheng/sblog 可以看一下 希望大家把錯誤的地方提出糾正一下。

                                                                                                                                                       謝謝

以上 內容都能在 django book 2   第四章和第五章和第八章 找到

擴展閱讀: https://docs.djangoproject.com/en/1.4/

推薦 Django 最佳實踐 - 中文版  https://github.com/brantyoung/zh-django-best-practices/blob/master/readme.rst/

ps: 大四學生求實習 郵箱: cacique1103#gmail.com

                                                                                                                下一篇將介紹如何自己書寫表單添加博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM