django 简易博客开发 2 模板和数据查询

时间:2023-03-09 06:04:49
django 简易博客开发 2 模板和数据查询

首先还是贴一下项目地址  https://github.com/goodspeedcheng/sblog   因为代码全在上面

上一篇博客我们介绍了 django的安装配置,新建project,新建app,app配置以及admin的使用,现在让我们来了解一下模板的使用和模型数据的显示。

1、首先介绍如何在视图中使用模板

方法1

django 简易博客开发 2 模板和数据查询

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)

django 简易博客开发 2 模板和数据查询

它使用了模板系统,但是模板仍然嵌入在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

django 简易博客开发 2 模板和数据查询

<!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>

django 简易博客开发 2 模板和数据查询

这个叫做 base.html 的模板定义了一个简单的 HTML 框架文档,我们将在本站点的所有页面中使用。 所有的子模板都在重载、添加或保留base.html块的内容。

{% block %}: 所有的 {% block %} 标签告诉模板引擎,子模板可以重载这些部分。 每个{% block %}标签所要做的是告诉模板引擎,该模板下的这一块内容将有可能被子模板覆盖。

然后在sblog目录下新建blog_list.html 添加以下内容

django 简易博客开发 2 模板和数据查询

{% 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 %}

django 简易博客开发 2 模板和数据查询

templates 标签使用 参见文档 :https://docs.djangoproject.com/en/1.4/topics/templates/

在sblog目录下views.py文件添加 内容

django 简易博客开发 2 模板和数据查询

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})

django 简易博客开发 2 模板和数据查询

当然,你也可以先修改视图再添加模板

现在视图和模板都完成了,让我们添加url吧

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

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

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

django 简易博客开发 2 模板和数据查询

#!/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 %}
)

django 简易博客开发 2 模板和数据查询

现在 让我们打开 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

现在就可以进行数据操作,因为数据想较多,我们在这里只进行查询过滤操作

django 简易博客开发 2 模板和数据查询

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] # 可以进行类似于列表的操作

django 简易博客开发 2 模板和数据查询

每次都要用 order_by() 显得有点啰嗦。 大多数时间你通常只会对某些 字段进行排序。 在这种情况下,Django让你可以指定模型的缺省排序方式:

修改 models.py

django 简易博客开发 2 模板和数据查询

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']

django 简易博客开发 2 模板和数据查询

3、添加博客展示页面

在sblog目录下添加blog_show.html 文件,添加以下内容

django 简易博客开发 2 模板和数据查询

{% 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 %}

django 简易博客开发 2 模板和数据查询

views.py 添加blog_show 视图

django 简易博客开发 2 模板和数据查询

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})

django 简易博客开发 2 模板和数据查询

修改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/

 

 

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