二 Django入门( 二 )


导入了类和刚才创建的表单 , 用户提交主题后我们将使用类将用户重定向到网页 。函数()根据指定的URL模型确定URL , 这意味着将在页面被请求时生成URL 。
首先判断请求方法是否是POST——如果请求方法不是POST , 返回一个空表单;如果请求方法是POST , 将使用用户输入的数据(存储在.POST中)创建一个实例 , 这样对象form将包含用户提交的信息 。
然后要将提交的信息保存到数据库 , 必须先通过检查确定它们是有效的 。函数()核实用户填写了所有必不可少的字段(表单字段默认都是必不可少的) , 且输入的数据与要求的字段类型一致 。如果所有字段都有效 , 我们就调用save()将表单中的数据写入数据库 。
最后使用()获取页面的URL , 并将其传递给() , 后者将用户的浏览器重定向到页面 。在页面中 , 用户将在主题列表中看到他刚输入的主题 。
创建Web应用程序时 , 将用到的两种主要请求类型是GET请求和POST请求 。对于只是从服务器读取数据的页面 , 使用GET请求;在用户需要通过表单提交信息时 , 通常使用POST请求 。处理所有表单时 , 我们都将指定使用POST方法 。
函数()将请求对象作为参数 。用户初次请求该网页时 , 其浏览器将发送GET请求;用户填写并提交表单时 , 其浏览器将发送POST请求 。根据请求的类型 , 我们可以确定用户请求的是空表单(GET请求)还是要求对填写好的表单进行处理(POST请求) 。
# vim learning_logs/templates/learning_logs/new_topic.html
{% extends "learning_logs/base.html" %}{% block content %}Add a new topic:

{% csrf_token %}{{ form.as_p }}{% endblock content %}

继承了base.html , 然后定义了一个HTML表单 。实参告诉服务器将提交的表单数据发送到哪里 , 这里我们将它发回给视图函数() 。实参让浏览器以POST请求的方式提交数据 。
使用模板标签{%%}来防止攻击者利用表单来获得对服务器未经授权的访问(这种攻击被称为跨站
请求伪造) 。接着显示表单 , 只需包含模板变量{{ form.as_p }} , 就可让自动创建显示表单所需的全部字段 。修
饰符as_p让以段落格式渲染所有表单元素 。
# vim learning_logs/templates/learning_logs/topics.html
{% extends "learning_logs/base.html" %}{% block content %}Topics
    {% for topic in topics %}
  • {{ topic }}
  • {% empty %}
  • No topics have been added yet.
  • {% endfor %}
Add a new topic:{% endblock content %}

添加新条目
现在已经可以添加新主题了 , 但是还不能添加新条目 , 再次定义URL , 编写视图函数和模板 , 并链接到添加新条目的网页 。
创建一个与模型Entry相关联的表单 。
# vim learning_logs/forms.py
from django import formsfrom .models import Topic, Entryclass TopicForm(forms.ModelForm):class Meta:model = Topicfields = ['text']labels = {'text': ''}class EntryForm(forms.ModelForm):class Meta:model = Entryfields = ['text']labels = {'text': ''}wgdgets = {'text': forms.Textarea(attrs={'cols': 80})}