回顾
在上一章节中,已经定义了一个简单的模板,使用占位符来虚拟了暂未实现的部分,比如用户以及文章等。
在本章将要讲述应用程序的特性之一–表单,本章将会详细讨论如何使用web 表单。
Web 表单是在任何一个web 应用程序中最基本的一部分。通过使用表单允许用户写文章,以及登录到应用程序中。
接下来讲述将从上一章离开的地方开始,所以请确保你的应用程序microblog 可以正确地安装和工作。
配置
为了能够处理web 表单,这里将使用Django来处理web表单的请求,web表单的请求有两种模式,get和post,在下面的例子中会首先展示post的使用。在表单处理中Django有三个作用:
•准备和重组数据以使其为HTML渲染做好准备
•为数据创建HTML表单
•接收和处理客户提交的表格和数据
在Django中,使用Post提交表单时,默认跨站请求伪造(CSRF)验证。因此,在定义模版时,需要配置{%csrf_token%},来生成唯一token。如果不想使用CSRF,需要对处理post方法函数需要使用装饰符@csrf_exempt来关闭CSRF验证。
用户登录表单
在Django中,表单是表示成对象,Form(django.forms.Form) 类的子类。一个表单子类简单地把表单的域定义成类的变量。
在这里将要创建一个登录表单,实现用户的认证系统。在Microblog应用程序中支持的登录机制是标准的用户名/密码类型。
所以编写第一个表单(文件 app/view/forms.py),如图3-1:
图3-1
这个类不言而明,首先导入Form 类,接着导入两个在验证Form中需要的字段类,TextField 和 PasswordField。
required,max_length 验证器只是简单地检查相应域提交的数据是否是空,长度是否合适等。在Django中有许多的验证器,将会在以后看到它们。
表单模板
同样需要一个包含生成表单的HTML 的模板。好消息是通过刚刚创建的LoginForm 类,可以知道如何呈现为HTML 表单字段,所以仅需要集中精力在布局上就可以。这里就是登录的模板(文件 templates/django/login.html),如图3-2:
图3-2
请注意,此模板中,重用了base.html 模板通过extends 模板继承声明语句。实际上,今后将在所有的模板中使用这一点,以确保所有网页的布局一致性。
模板与常规的HTML 表单之间存在一些有意思的不同处。模板期望一个实例化刚才创建地表单类的表单对象储存成一个模板参数,称为form。当编写渲染这个模板的视图函数的时候,将会特别注意传送这个模板参数到模板中。csrf_token参数将被替换为一个隐藏字段,用来是实现在配置中激活的CSRF 保护。如果你已经激活了CSRF,这个字段需要出现在你所有的表单中。表单中实际的字段也将会被表单对象渲染,只需要在字段应该被插入的地方指明一个{} 模板参数。某些字段是可以带参数的。在我们的例子中,我们要求表单生成一个20 个字符宽度的 username 字段和一个20个字符宽度的password。因为我们并没有在表单中定义提交按钮,我们必须按照普通的字段来定义。提交字段实际并不携带数据因此没有必要在表单类中定义。另外,渲染表单还有一个更简单的方式{{ form }},不过这种渲染方式不能很好的布局页面,通常不采用。
表单视图与接收数据
在看到表单前还需要编写渲染模板的视图函数的代码。实际上渲染试图十分简单,这一步时HTTP的GET请求,只需要把一个表单对象传入模板中。数据的接收是通过HTTP的POST请求,通过POST数据生成一个Form对象,并执行Form的is_valid,这个函数检查表单提交的数据是否符合Form中的定义,如果通过定义,就可以接受表单的数据并执行操作。这就是新的视图函数,如图3-3:
图3-3
在可以通过浏览器来浏览数据时,最后一步在urls中配置分发器,配置方式已经反复阐述过,内容如图3-4:
图3-4
这个时候可以尝试运行应用程序,在浏览器上看看表单。运行应用程序后,在浏览器上打开http://localhost:8000/app/dologin 就可以看到运行效果。
更新base.html模版,增加登录链接
到目前为止,login画面可以很好的工作,接下来需要将login的功能增加到导航栏,在用户第一次进入Microblog是显示Sign In链接,再次进入时,显示Welcome username。在这里设置登录信息为session有效,因此需要通过session来存储登录信息,并以此判断显示的文字或者链接。
首先,在dologin时,当用户验证成功(暂时没有实现)时,将user信息,写入session来保存用户的登录状态,代码如图3-5:
图3-5
需要注意的是,session的传导需要request,因此使用render函数来渲染模版,才能正确的在模版中得到session中的值。之前views中的函数,有的没有采用render函数来渲染模版,请读者自行修改。相应的base.html模版也需要修改,在模版中进行是否已经登录的判断,并采用不同的渲染方式,代码如图3-6:
图3-6
需要注意的在第一使用session 时,如果出现”no such table: django_session”的错误提示,需要进行一次数据库同步,在Eclipse中方法如下,在工程目录上点击邮件,按照图3-7进行选择,执行相应的命令,如图3-7:
图3-7
这相当直接执行命令:$ python manage.py makemigrations。
执行完成了,按照图3-8进行操作,完成数据库迁移。如图3-8:
图3-8
这相当于执行命令:$ python manage.py migrate。
这其实是Django中数据库迁移的方式,在后面的model模块也能用到。
结束语
目前为止在登录表单上已经取得了很多进展,但实际上没有做任何用户登录到Micorblog系统,到目前为止仅仅做的是登录过程的GUI 方面的工作。这是因为在做实际登录之前,还需要有一个数据库,那里可以记录Microblog的用户。
在下一章中,将会构筑Microblog的数据库并且运行它,并完成登录系统。敬请关注后续文章。
领取专属 10元无门槛券
私享最新 技术干货