django入门教程(下)

两篇文章帮你入门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的一些疑问。

时间: 2024-12-21 02:53:47

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

django入门教程(上)

相信用过python的人都听过Django的大名,知道它是一个web框架,用来支持动态网站.网络应用程序以及网络服务的开发.那么为什么我们需要一个web框架,而不是直接用python来写web应用呢?其实简单来说,就是为了偷懒. 如果不用框架的话,你可能需要连接数据库.查询数据库.关闭数据库,在python代码文件里掺杂html标签.css样式等.并且每次开始一个web应用,你都要从头开始写起,重复许多枯燥无味的代码. 而web框架提供了通用web开发模式的高度抽象,使我们可以专注于编写清晰.易

jenkins 入门教程(下)

接上回继续学习jenkins,这次主要来看一些疑难杂症: 一.yum install安装方式 除了直接java -jar jenkins.war方式,还可以用yum安装,这种方式下提供了更多的可配置选项,更适合生产环境控制jenkins的行为. sudo yum update -y (可选) sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo sudo rpm --imp

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

转帖地址:http://blog.csdn.net/wangnan537/article/details/46475105 2. 进销存实务 2.1 销售产品 李逍遥接到客户苏州美尚邻里超市购买10只乐扣乐扣拉杆箱的请求后,登录系统,点击菜单 [销售->销售->报价单],点击新建,将客户设为“苏州美尚邻里超市”,在订单明细选项卡点击添加一个项目,产品设为“乐扣乐扣拉杆箱”,数量设为10,此时会提示没足够的库存,这是因为仓库中并没有存货(如果产品的路线已勾选Make To Order的话,则没有

Android基础入门教程——2.3.12 Date & Time组件(下)

Android基础入门教程--2.3.12 Date & Time组件(下) 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来继续学习Android系统给我们提供的几个原生的Date & Time组件,他们分别是: DatePicker(日期选择器),TimePicker(时间选择器),CalendarView(日期视图),好吧, 其实一开始让我扣这几个玩意我是拒绝的,因为在我的印象里,他们是这样的: 简直把我丑哭了,有木有,终于知道为什么那么多人喜欢自定义这种类型的

深入学习:Windows下Git入门教程(下)

声明:由于本人对于Git的学习还处于摸索阶段,对有些概念的理解或许只是我断章取义,有曲解误导的地方还请见谅指正! 一.分支 1.1分支的概念. 对于的分支的理解,我们可以用模块化这个词来解释:在日常工作中,一个项目的开发模式往往是模块化,团队协作式的开发.这样我们项目的进度可以称得上多核并发式的开发了.这种模块化的开发要求我们尽可能的高内聚低耦合以免造成一只胳膊没了整个人都废了的局面.因此在所有的版本控制器对代码进行管理的时候都引入了分支这个概念.那么分支是什么呢? 分支是相对于主干来说的,或者

Spring Cloud 入门教程(四): 分布式环境下自动发现配置服务

前一章, 我们的Hello world应用服务,通过配置服务器Config Server获取到了我们配置的hello信息"hello world". 但自己的配置文件中必须配置config server的URL(http://localhost:8888), 如果把config server搬到另外一个独立IP上, 那么作为一个client的hello world应用必须修改自己的bootstrap.yml中的config server的URL地址.这明显是不够方便的. 既然confi

深入学习:Windows下Git入门教程(上)

一,安装Git: 1.1Linux上安装命令: sudo apt-get install git 1.2在Windows上安装Git: 使用Windows版的msysgit,官方下载地址:http://msysgit.github.io/,点击进入官网,如果官网无法正常下载我这里有当前的最新版,已经上传到CSDN上,下载地址为:http://download.csdn.net/detail/huangyabin001/7564005,点击进入下载 1.3安装完成进行配置: $ git confi

Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE

Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE Windows平台下安装Arduino IDE Windows操作系统下可以使用安装向导和压缩包形式安装.下面详细讲解这两种方式. 1.Arduino IDE Windows安装向导方式 Windows安装向导方式安装和绝大多数Windows应用程序安装类似,只需要直接运行下载的.exe文件即可.例如1.6.0版本的安装向导方式的文件名为arduino-1.6.0-windows.exe.直接双击该文件即可开始安装.

渐进式Web应用(PWA)入门教程(下)

上篇文章我们对渐进式Web应用(PWA)做了一些基本的介绍. 渐进式Web应用(PWA)入门教程(上) 在这一节中,我们将介绍PWA的原理是什么,它是如何开始工作的. 第一步:使用HTTPS 渐进式Web应用程序需要使用HTTPS连接.虽然使用HTTPS会让您服务器的开销变多,但使用HTTPS可以让您的网站变得更安全,HTTPS网站在Google上的排名也会更靠前. 由于Chrome浏览器会默认将localhost以及127.x.x.x地址视为测试地址,所以在本示例中您并不需要开启HTTPS.另