Django - 02 优化一个应用

 

上一篇中我们已经创建了一个blog app,现在来用一下~

2.1 添加第一篇blog


这个post 列表很丑陋哦,连标题都木有显示~

2.2 自定义blog list

自定义下 blog/model.py

from django.db import models
from django.contrib import admin # Create your models here.
#django.db.models.Model is the core partof the ORM system of Django
class BlogPost(models.Model):
# Django will add an auto-increment, unique id
title = models.CharField(max_length=150)
body = models.TextField()
timestamp = models.DateTimeField() class BlogPostAdmin(admin.ModelAdmin):
list_display = ('title', 'timestamp') admin.site.register(BlogPost, BlogPostAdmin)

server会检测到文件代码的变动,无需重启,即更新(Django超赞的神器):

[11/Sep/2014 16:26:23] "POST /admin/blog/blogpost/add/ HTTP/1.1" 200 5177
[11/Sep/2014 16:26:23] "GET /admin/jsi18n/ HTTP/1.1" 200 2372
[11/Sep/2014 16:26:23] "GET /static/admin/img/icon_error.gif HTTP/1.1" 200 319
[11/Sep/2014 16:26:28] "POST /admin/blog/blogpost/add/ HTTP/1.1" 302 0
[11/Sep/2014 16:26:28] "GET /admin/blog/blogpost/ HTTP/1.1" 200 4597
[11/Sep/2014 16:26:28] "GET /admin/jsi18n/ HTTP/1.1" 200 2372
Performing system checks... System check identified no issues (0 silenced).
September 11, 2014 - 16:28:13
Django version 1.7, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
[11/Sep/2014 16:28:27] "GET /admin/blog/blogpost/ HTTP/1.1" 200 4779
[11/Sep/2014 16:28:27] "GET /static/admin/css/base.css HTTP/1.1" 304 0
[11/Sep/2014 16:28:27] "GET /static/admin/js/core.js HTTP/1.1" 304 0
[11/Sep/2014 16:28:27] "GET /static/admin/css/changelists.css HTTP/1.1" 304 0
[11/Sep/2014 16:28:27] "GET /static/admin/js/admin/RelatedObjectLookups.js HTTP/1.1" 304 0
[11/Sep/2014 16:28:27] "GET /static/admin/js/jquery.js HTTP/1.1" 304 0
[11/Sep/2014 16:28:27] "GET /static/admin/js/jquery.init.js HTTP/1.1" 304 0
[11/Sep/2014 16:28:27] "GET /static/admin/js/actions.js HTTP/1.1" 304 0
[11/Sep/2014 16:28:27] "GET /admin/jsi18n/ HTTP/1.1" 200 2372

现在每次点击了文章的标题,是不是直接进入了update post的界面呢?但是按照一般习惯,是不是应该还有个view post的界面啊!!!

2.3 建立blog的公共部分

完成了app的数据库和admin部分后,来看看面向公众的页面部分。

从Django的角度来说, 一个也没具有3个典型的组件:

  • template: 负责将传递进来的信息显示出来,类似python字典的对象Context
  • view函数: 负责获取要显示的信息,通常来自db
  • URL模式:用来把收到的请求和你的视图函数匹配,也会想视图传递参数

2.3.1 创建模板

ganiks.liu@MAMIS-GAIKS-LIU /E/mysite/mysite/blog/templates (master)
$ ls -l
total 1
-rw-r--r-- 1 ganiks.l Administ 121 Sep 11 16:34 archive.html ganiks.liu@MAMIS-GAIKS-LIU /E/mysite/mysite/blog/templates (master)
$ cat archive.html
{% for post in posts %}
<h2>{{ post.title }}</h2>
<p>{{ post.timestamp }}</p>
<p>{{ post.body }}</p>
{% endfor %}

2.3.2 创建一个视图函数

#Django1.7 version
from django.shortcuts import render
from mysite.blog.models import BlogPost # Create your views here. def archive(request):
posts = BlogPost.objects.all()
return render(request, 'archive.html', {'posts': posts})

看看老版本的

#Django old versions
from django.template import loader, Context
from django.http import HttpResponse
from mysite.blog.models import BlogPost def archive(request):
posts = BlogPost.objects.all()
return HttpResponse(loader.get_template("archive.html").render(Context({'posts': posts })))

2.3.3 创建一个URL模式

先修改下mysite的url

from django.conf.urls import patterns, include, url
from django.contrib import admin urlpatterns = patterns('',
# Examples:
# url(r'^$', 'mysite.views.home', name='home'),
url(r'^blog/', include('mysite.blog.urls')), url(r'^admin/', include(admin.site.urls)),
)

再在mysite.blog目录下创建urls.py

from django.conf.urls import patterns, include, url
from mysite.blog.views import archive urlpatterns = patterns('',
url(r'^$', archive),
)

访问下http://localhost:8000/blog/就可以看到blog列表的效果了

2.4 最后的润色

2.4.1 模板的精确定位

这里考虑到模板在后期的可重用性,将之前的archive.html拆分出一个base.html

base.html

<html>
<style type="text/css" charset="uft-8">
body{
background: #ededed;
margin: 0;
padding: 20px;
}
h1{
color: brown;
padding: 10px;
border: 2px solid #000de3;
}
</style>
<body>
<h1>http://www.cnblogs.com/ganiks/</h1>
{% block content %}
{% endblock %}
</body>
</html>

archive.html

{% extends "base.html" %}
{% block content %}
{% for post in posts %}
<h2>{{ post.title }}</h2>
<p>{{ post.timestamp }}</p>
<p>{{ post.body }}</p>
{% endfor %}
{% endblock %}

2.4.2 按日期排序

如图,blog列表中文章并没有按照时间倒序排列;想要做到这个,有2种方式:
修改model排序和或者在view中给BlogPost.objects.all()添加排序方法

这里采用修改model,很简单,给model顶一个Meta嵌套类,然后设置ordering属性

from django.db import models
from django.contrib import admin # Create your models here.
#django.db.models.Model is the core partof the ORM system of Django
class BlogPost(models.Model):
# Django will add an auto-increment, unique id
title = models.CharField(max_length=150)
body = models.TextField()
timestamp = models.DateTimeField()
class Meta:
ordering = ('-timestamp',) class BlogPostAdmin(admin.ModelAdmin):
list_display = ('title', 'timestamp') admin.site.register(BlogPost, BlogPostAdmin)

千万不要忘记ordering = ('-timestamp', ) 小括号结尾的逗号!
这代表这是一个单元素的元组,而不是一个带小括号的字符串。
比如,可以这样定义排序 ordering = ('-timestamp', 'title')

2.4.3 通过模板过滤器格式化时间戳

看看这个页面还有没有不顺眼的地方,比如Sept. 11, 2014, 4:23 p.m.这个玩意的格式不爽

在介绍一个Django的神器————过滤器(filter)

这个东西,是一个表示层的细节,所以最适合用的地方就是在模板中

<p>{{ post.timestamp }|date }} </p>
<p>{{ post.timestamp }|date:"l, F jS" }} </p>

好了,显示变成了Friday, September 12th

注意,这里不要在冒号两边留有空格,Django的模板引擎对空格敏感(真的假的?貌似没影响啊我这里)

2.5 总结下Django

  • 内置的Web服务器让开发工作自给自足,同时它可以自动加载你代码的变动!!!
  • 数据模型的创建采用纯python的方式完成,不用刚维护编写任何SQL代码或者XML
  • 自动话的admin特性,提供了完整的内容编辑特性
  • 模板系统,可以用来生成HTML CSS Javascript及其他任何文本输出格式
  • 模板过滤器,在显示层修改数据显示
  • URLconfi系统,在给与你RUL设计极大灵活性的同时,还能将应用程序特定的URL部分保留在其所属的应用程序内部

转自:http://www.cnblogs.com/ganiks/p/django-optimize-an-app.html

Django - 02 优化一个应用的更多相关文章

  1. Oracle数据库该如何着手优化一个SQL

    这是个终极问题,因为优化本身的复杂性实在是难以总结的,很多时候优化的方法并不是用到了什么高深莫测的技术,而只是一个思想意识层面的差异,而这些都很可能连带导致性能表现上的巨大差异. 所以有时候我们应该先 ...

  2. django性能优化

    1. 内存.内存,还是加内存 2. 使用单独的静态文件服务器 3. 关闭KeepAlive(如果服务器不提供静态文件服务,如:大文件下载) 4. 使用memcached 5. 使用select_rel ...

  3. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  4. Django 02 url路由配置及渲染方式

    Django 02 url路由配置及渲染方式 一.URL #URL #(Uniform Resoure Locator) 统一资源定位符:对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是 ...

  5. django+pymysql搭建一个管理系统(一)

    django+pymysql搭建一个管理系统(一) 后续进行代码更新,优化 一.程序架构 二.mysql表单创建 zouye库:存信息相关的 #班级表 create table classes( ci ...

  6. ReactNative新手学习之路02第一个RN项目

    开始第一个RN项目(iOS版)我的电影列表0.1版,后面做列表版 打开上一节项目 index.ios.js,android打开index.android.js.我这里使用的是Atom编辑器,你也可以使 ...

  7. Django学习 之 Django安装与一个简单的实例认识

    一.Django简介 1.MVC与MTV模型 (1)MVC模型 Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的. ...

  8. 19 01 17 Django 模板 返回一个页面

    模板 问题 如何向请求者返回一个漂亮的页面呢? 肯定需要用到html.css,如果想要更炫的效果还要加入js,问题来了,这么一堆字段串全都写到视图中,作为HttpResponse()的参数吗?这样定义 ...

  9. 基于django快速开发一个网站(一)

    基于django快速开发一个网站(一) *  创建虚拟环境.基于虚拟环境创建django==2.0.0和图片加载库和mysql数据库驱动 1. 创建目录并创建虚拟环境 ╰$ mkdir Cornuco ...

随机推荐

  1. c#异步调用

    首先来看一个简单的例子: 小明在烧水,等水烧开以后,将开水灌入热水瓶,然后开始整理家务 小文在烧水,在烧水的过程中整理家务,等水烧开以后,放下手中的家务活,将开水灌入热水瓶,然后继续整理家务 这也是日 ...

  2. ForkJoin框架

    1. 什么是Fork/Join框架 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架. 我们再通过 ...

  3. 最简单的Tcp Udp的例子

    //1.WinSock包含2个主要的版本,即WinSock1和WinSock2.前者需要包含头文件WinSock.h和库文件wsock32.lib,后者需要包含头文件WinSock2.h和库文件ws2 ...

  4. BenchmarkSQL测试脚本实现

    sqlTableCreates DROP SCHEMA IF EXISTS benchmarksql CASCADE; CREATE SCHEMA benchmarksql; create table ...

  5. ads 调试

    1.路径错误,中文名称 2.定义错误

  6. Lintcode: Previous Permuation

    Given a list of integers, which denote a permutation. Find the previous permutation in ascending ord ...

  7. IOS Suppot Font 苹果默认支持的字体一览2(普通,加粗,倾斜)

  8. [原创]java WEB学习笔记62:Struts2学习之路--表单标签:form,表单标签的属性,textfield, password, hidden,submit ,textarea ,checkbox ,list, listKey 和 listValue 属性,select ,optiongroup ,checkboxlist

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. centos每天一句命令

    shutdown -h now 立刻关机  后面可以加上关键的时间  -r 重启 reboot 重启  同时记载以下,仅仅给刚刚接触的新手来说的  按两次tab 键会自动命令 cd 到目录下 su r ...

  10. extjs实现简单的多文件上传(不借助任何插件),以及包含处理上传大文件的错误的各种处理办法

    在extjs的学习过程中,有遇到过有关多文件上传的问题,但是网上的大多数都是专门的去实现多文件上传而去做的组件之类的,没有特别简单的方式,于是小白便做了下面的内容,只是通过动态的去添加extjs的自带 ...