两篇文章帮你入门Django(上)一文中,我们已经做了一个简单的小网站,实现了保存用户数据到数据库,以及从后台数据库读取数据显示到网页上这两个功能。

看上去没有什么问题了,不过我们可以让它变得更加完美,比如说为它添加一个简单的后台,用来管理我们的Question数据库,或者是写点测试单元来看看我们的程序有没有什么Bug。

后台管理

首先需要添加后台管理员账号,只需要简单的 createsuperuser 命令,如下:

$ python manage.py createsuperuser
Username (leave blank to use 'feizhao'): happy
Email address:
Password:
Password (again):
Superuser created successfully.

然后就可以通过 http://127.0.0.1:8000/admin/ 进入管理员登录页面。我们用刚才创建的管理员账号登录成功后就会看到GroupsUsers两个可以编辑的内容,它们是Django内置的认证模块django.contrib.auth提供的数据库,进入Users就会看到刚刚创建的管理员用户happy了。

目前后台还看不到我们的Question数据库,因为还没告诉后台它的存在。我们可以在questions应用下的admin.py文件里面注册该数据库的存在,注册的语句非常简单,如下:

from django.contrib import admin
from questions.models import Question admin.site.register(Question)

这样我们刷新后台之后,就能看到Question数据库了,如下图:

进入Question数据库后,我们会看到每一条记录,不过这里显示的结果可能是这样子:

这是因为默认情况下,每条记录显示的是str()返回的内容,而我们没有在class Question(models.Model)中覆盖该方法。不过我们可以在这里指定数据库记录显示某个字段,方法也特别简单,修改admin.py如下:

class QuestionAdmin(admin.ModelAdmin):
list_display = ('context',) admin.site.register(Question, QuestionAdmin)

这样每条记录显示的就是context内容了,我们进去某条记录后,会看到所有的字段,并且可以进行更新、删除、添加等操作。Django后台的可定制性还是非常高的,我们可以按照自己爱好打造属于自己的后台。

自动化测试

Django另一个比较不错的地方就是提供了完整的自动化测试机制,方便开发人员进行测试。仍然以我们前面的questions这个应用为例,我们 会发现在问题描述框没有输入任何内容时点击提交,仍然会跳转到添加成功页面,也就是说我们添加了一个空的问题,这当然不是我们想要的,我们可以写一个程序 来测试我们的添加问题的功能。

Django中,实现测试非常简单,我们可以在questions应用中新建tests.py文件,在里面写好测试逻辑,然后用django的测试系统完成测试。下面即为我们的测试程序questions/tests.py:

from django.test import TestCase
from django.test import Client class QuestionMethodTests(TestCase):
def test_add(self):
client = Client()
response = client.post('/add_done/', {'content': ""})
self.assertNotEqual(response.status_code, 200)

我们模拟了一个客户端client,将空字符串传给content字段,然后发起一个post请求到/add_done/页面(默认情况下测试时并不检查CSRF字段),然后断言post请求不成功(也就是返回包的状态码不为200)。下面运行测试程序:

$ python manage.py test questions
Creating test database for alias 'default'...
F
======================================================================
FAIL: test_add (questions.tests.QuestionMethodTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/feizhao/Documents/python_demo/mysite/questions/tests.py", line 10, in test_add
self.assertNotEqual(response.status_code, 200)
AssertionError: 200 == 200 ----------------------------------------------------------------------
Ran 1 test in 0.009s FAILED (failures=1)
Destroying test database for alias 'default'...

测试没通过,说明确实插入了空白问题。注意测试时并不需要运行web服务,这样能节省HTTP服务的开销,提高测试的速度。现在对views中的add_done稍作改动,如下:

def add_done(request):
content = request.POST['content']
if content != "":
add_question = Question()
add_question.context = content
add_question.save()
return render(
request,
"questions/add_done.html",
{'question': content},
)
else:
return redirect("/add/")

首先检查字符串是否为空,为空的话重定向页面到/add/,不为空则添加问题成功。再次运行测试程序,则通过测试,结果如下:

$ python manage.py test questions
Creating test database for alias 'default'...
.
----------------------------------------------------------------------
Ran 1 test in 0.007s OK
Destroying test database for alias 'default'...

其实这个应用还有bug就是一个问题可能重复提交多次,这里不详细阐述。

命令行交互

有时候我们想验证下某条语句是否符合预期,或者是输出某个变量观察一下值,这时候直接在项目里实现可能会非常麻烦。这种情况可以使用python解释器的交互模式,为了避免手动导入django的配置环境,可以运行 python manage.py shell,然后就可以使用django的API,并且在当前项目目录进行交互,如下例:

$ python manage.py shell
Python 2.7.5 (default, Mar 9 2014, 22:15:05)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from questions.models import Question
>>> null_question = Question()
>>> null_question.save()
>>> for question in Question.objects.all():
... print question.context
...
as
as
程序员为什么最帅
程序为什么老出bug >>>

交互模式使用起来可能事半功倍,所以不要忘了哦。

深入学习

好了,前面就是django的一些重要的特点了,下面来看看有哪些资源可以帮我们更好地学习django。

Django中国社区是国内的Django开发社区,人气不是很旺,不过也能在里面找到有用的东西。比如@evilbinary在这里一个博客,兼容wp,代码高亮功能支持 提供了一个用Django搭建的博客,并给出了源码,我们可以学习。还有一些不错的Django开源项目,比如这个小的BBS论坛fairybbs,还有这个登录的应用django-siteuser

中文的教程目前有djangobook 2.0,但是书中使用的Django版本太低,因此不推荐使用。英文的资料还是挺丰富,不过还是推荐读文档,虽然文档有时候特别坑人(被坑了好多次)。

此外,除了Stackoverflow(这个太喜欢了,谁用谁知道,不用担心英语太烂,放代码和错误提示,实在不行用Google翻译加一点描述就行。总而言之,SO就是程序员的天堂啊), Segmentfault这些问答网站,很多Django用户在邮件列表(邮件列表是groups.google.com,所以你懂的)里提问题、回答问题,这里的氛围非常不错,各种问题都有人来帮你。比如这种中二的问题Serving static files and media in Django 1.7.1也是有人十分认真的作答的。所以,不要害羞,有问题大胆问吧。

如果你决定好好玩Django了,那么先看一下Django FAQ,可能会解决关于Django的一些疑问。

django入门教程(下)的更多相关文章

  1. 【django入门教程】Django的安装和入门

    很多初学django的朋友,都不知道如何安装django开发以及django的入门,今天小编就给大家讲讲django入门教程. 注明:python版本为3.3.1.Django版本为1.5.1,操作系 ...

  2. django入门教程(上)

    相信用过python的人都听过Django的大名,知道它是一个web框架,用来支持动态网站.网络应用程序以及网络服务的开发.那么为什么我们需要一个web框架,而不是直接用python来写web应用呢? ...

  3. Django入门教程(二)

    建议直接阅读末尾!!! Writing your first Django app, part 2 本节将设置数据库,创建您的第一个模型(model),并简单介绍Django自动生成的管理页面. 数据 ...

  4. jenkins 入门教程(下)

    接上回继续学习jenkins,这次主要来看一些疑难杂症: 一.yum install安装方式 除了直接java -jar jenkins.war方式,还可以用yum安装,这种方式下提供了更多的可配置选 ...

  5. Odoo进销存(采购、销售、仓库)入门教程 - 下

    转帖地址:http://blog.csdn.net/wangnan537/article/details/46475105 2. 进销存实务 2.1 销售产品 李逍遥接到客户苏州美尚邻里超市购买10只 ...

  6. Spring Boot入门教程1、使用Spring Boot构建第一个Web应用程序

    一.前言 什么是Spring Boot?Spring Boot就是一个让你使用Spring构建应用时减少配置的一个框架.约定优于配置,一定程度上提高了开发效率.https://zhuanlan.zhi ...

  7. Spring Boot入门教程2-1、使用Spring Boot+MyBatis访问数据库(CURD)注解版

    一.前言 什么是MyBatis?MyBatis是目前Java平台最为流行的ORM框架https://baike.baidu.com/item/MyBatis/2824918 本篇开发环境1.操作系统: ...

  8. 【秒懂】号称最为简明实用的Django上手教程(下)

    号称最为简明实用的Django上手教程(下) 作者:白宁超 2017年8月25日08:51:58 摘要:上文号称[最为简明实用的Django上手教程]介绍了django基本概念.配置和相关操作.相信通 ...

  9. Django新手图文入门教程

    版权所有,转载需注明来源! 本文是广受大家欢迎的<Django1.10新手图文入门教程>的2.1版本升级篇,原1.10版本传送门点击我 本文面向有一些的Python基础,但刚接触web框架 ...

随机推荐

  1. Linux ps aux指令詳解--转

    linux上进程有5种状态: 1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有 ...

  2. 关于ComponentName的使用

    ComponentName,顾名思义,就是组件名称,通过调用Intent中的setComponent方法,我们可以打开另外一个应用中的Activity或者服务. 实例化一个ComponentName需 ...

  3. Android_Intent_passValueForResult

    当SecondActivity需要回传参数时:1. MainActivity启动SecondActivity时需要调用startActivityForResult() 并定义请求码2. SecondA ...

  4. 利用Qt制作一个helloworld

    使用QT创建第一个 工程: 1.打开应用程序: 2.单击画面中间偏上的 New Project按钮.[要学习使用啊~,传说它的跨平台行很好,QQ就是用它编辑的.] 3.直接点击右下角的选择 按钮. 4 ...

  5. Cygwin下安装vim后,vim中退格键无法正常使用

    问题描述: 在Cygwin中安装完vim后 进入vim,发现上下左右键和退格键都无法正常使用 问题分析: 首先考虑到的就是缺少vim的配置文件,首先查看/etc路径下是否有vim的配置文件 admin ...

  6. 第十篇:web之前端之django一些feature

    前端之django一些feature   前端之django一些feature 本节内容 cookie session 跨站请求保护 分页 序列化 model模块 CBV和FBV 模板渲染对象 1. ...

  7. 【转】性能测试设计和LR原理的探讨

    做了4个迭代的性能测试, 在没有需求的情况下步步艰辛,把代码和框架独立开发从0到一万多行代码的测试工具(脚本),作为性能测试工具佼佼者Lr,我时而拿他作参考,山寨了它很多 东西,同时带有很多疑问对它实 ...

  8. PHP 概述 特点 基础语法

    PHP是什么 http://php.net/manual/zh/intro-whatis.php#intro-whatis  PHP(Hypertext Preprocessor,超文本预处理器)是一 ...

  9. <video>和<audio>标签

    一.<video>基本格式: <video width=" " heigh="" src=""> </vide ...

  10. mvc Routing特性优化

    在mvc中,Url地址是利用routing特性来支持,但是这个Routing有个问题,多个不同的地址和指向同一个action方法, 例如: http://test.com (默认) http://te ...