首先還是貼一下項目地址 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
下一篇將介紹如何自己書寫表單添加博客