前幾天寫的django 簡易部落格開發記錄,貼個連結吧
django 簡易部落格開發 1 安裝、建立、配置、admin使用
http://www.cnblogs.com/cacique/archive/2012/09/29/2707976.html
django 簡易部落格開發 2 模板和資料查詢
http://www.cnblogs.com/cacique/archive/2012/09/30/2709143.html
django 簡易部落格開發 3 靜態檔案、from 應用與自訂
http://www.cnblogs.com/cacique/archive/2012/10/01/2709668.html
django 簡易部落格開發 4 comments庫使用及ajax支援
http://www.cnblogs.com/cacique/archive/2012/10/03/2710803.html
django 簡易部落格開發 5 markdown支援、代碼高亮、gravatar頭像服務
http://www.cnblogs.com/cacique/archive/2012/10/07/2713703.html
--------------------------------------------------
django 簡易部落格開發 2 模板和資料查詢
首先還是貼一下項目地址 https://github.com/goodspeedcheng/sblog 因為代碼全在上面
上一篇部落格我們介紹了 django的安裝配置,建立project,建立app,app配置以及admin的使用,現在讓我們來瞭解一下模板的使用和模型資料的顯示。
1、首先介紹如何在視圖中使用模板
方法1
from django.template import Template, Contextfrom django.http import HttpResponseimport datetimedef 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_responsefrom sblog.models import Blogdef 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 Http404def 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
下一篇將介紹如何自己書寫表單添加部落格