两篇文章帮你入门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. Enable SPI 1.0 and 1.1 with device tre overlays on BeagleBone

    For most people the above image means absolutely nothing, but for that one guy that has been searchi ...

  2. Android开发之异步获取并下载网络资源-下载图片和下载文本内容

    在android网络开发过程中,经常需要获取网络资源,比如下载图片,下载文本文件内容等,这个时候就需要http请求来获取相应的网络资源.首先看看实例效果图:              下载图片截图   ...

  3. Java基础知识强化之IO流笔记42:IO流总结(图解)

    1. IO流总结(图解)

  4. Android_life,Intent_note

    生命周期: 从出生到死亡 Activity生命周期的7个方法和3个循环 onCreate() 创建时调用onRestart() 不可见到可见时调用onStart() 用户可见时调用onResume() ...

  5. SQL SERVER HTTP请求

    --开启Sql Server 通讯配置-- sp_configure ; GO RECONFIGURE WITH OVERRIDE; GO sp_configure ; GO RECONFIGURE ...

  6. cordova 创建ios项目

    cordova create fmscmsios1023 com.weilian.fmscms fmscms cd fmscms cd fmscmsios1023/ cordova platforms ...

  7. 飞锐GIS开发基础系列

    3s知识库和GIS科研站,未经允许,禁止任何形式的复制.转载和传播.联系方式:276888624@qq.com 品GIS,品开发,品人生...... http://www.3sbase.com/3sb ...

  8. OpenJudge 1806:词典find()与end()

    1806:词典 总时间限制:  3000ms  内存限制:  65536kB 描述 你旅游到了一个国外的城市.那里的人们说的外国语言你不能理解.不过幸运的是,你有一本词典可以帮助你. 输入 首先输入一 ...

  9. Google Test Frame 简单使用例子

    1 序言——为什么折腾Google Test 被逼无奈的. 最近研究google开源的基于列存储的数据库查询引擎supersonic源码.初略的浏览了一遍代码,竟然没有main函数,顿时惊讶的目瞪口呆 ...

  10. Dynamic Programming: From novice to advanced

    作者:Dumitru 出处:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=dynProg An impo ...