原文地址html
在两篇文章帮你入门Django(上)一文中,咱们已经作了一个简单的小网站,实现了保存用户数据到数据库,以及从后台数据库读取数据显示到网页上这两个功能。python
看上去没有什么问题了,不过咱们可让它变得更加完美,好比说为它添加一个简单的后台,用来管理咱们的Question数据库,或者是写点测试单元来看看咱们的程序有没有什么Bug。git
首先须要添加后台管理员帐号,只须要简单的 createsuperuser
命令,以下:程序员
$ python manage.py createsuperuser Username (leave blank to use 'feizhao'): happy Email address: Password: Password (again): Superuser created successfully.
<!-- more -->github
而后就能够经过 http://127.0.0.1:8000/admin/ 进入管理员登陆页面。咱们用刚才建立的管理员帐号登陆成功后就会看到Groups
和Users
两个能够编辑的内容,它们是Django内置的认证模块django.contrib.auth
提供的数据库,进入Users就会看到刚刚建立的管理员用户happy了。web
目先后台还看不到咱们的Question数据库,由于还没告诉后台它的存在。咱们能够在questions应用下的admin.py
文件里面注册该数据库的存在,注册的语句很是简单,以下:shell
from django.contrib import admin from questions.models import Question admin.site.register(Question)
这样咱们刷新后台以后,就能看到Question数据库了,以下图:数据库
进入Question数据库后,咱们会看到每一条记录,不过这里显示的结果多是这样子:django
这是由于默认状况下,每条记录显示的是str()
返回的内容,而咱们没有在class Question(models.Model)
中覆盖该方法。不过咱们能够在这里指定数据库记录显示某个字段,方法也特别简单,修改admin.py以下:app
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的一些疑问。