1.1-添加新主题
首先让用户能够添加新主题。创建基于表单的页面的方法几乎与前面创建页面一样:定义URL->编写视图函数->编写模板。一个主要差别是,需要导入包含表单的模块forms.py。
a.用于添加主题的表单
- 判断用户输入的信息
- ModelForm来创建表单
- 创建名为forms.py的文件存储到models.py所在目录,并在其中编写第一个表单
forms.py
from django import forms
#导入模块forms以及要使用的模型Topic
from .models import Topic
#定义一个名为TopicForm的继承了forms.ModelForm的类
class TopicForm(forms.ModelForm):
class Meta:
#最简单的ModelForm版本只包含一个内嵌的Meta类,让Django根据哪个模型创建表单以及在表单中包含哪些字段
model = Topic
#根据模型Topic创建表单,其中只包含字段text
fields = ['text']
labels = {'text':''}
#让Django不要为字段text生成标签
b.URL模式new_topic
- 新页面的URL简短且具有描述性
- 每当用户添加主题时,切换到http://xxx/new_topic/
- 将页面new_topic的URL模式添加到noways_app/urls.py中
urls.py
--snip--
urlpatterns = [
--snip--
#用于添加新主题的页面
path('new_topic/',views.new_topic,name='new_topic'),
]
- 这个URL模式将请求交给视图函数new_topic(),下面来编写这个函数
c.视图函数new_topic()
- 进入new_topic页面--显示空表单
- 对提交的表单数据进行处理
- 将用户重定向到页面topics:
views.py
from django.shortcuts import render,redirect
#导入函数redirect用户提交主题后将使用这个函数重定向到页面topics,函数redirect将视图名作为参数,并将用户重定向到这个视图
from .models import Topic
from .forms import TopicForm
#导入刚刚创建的表单TopicForm
--snip--
def new_topic(request):
'''添加新主题'''
if request.method != 'POST':#测试确定请求方法类型
#未提交数据:创建一个新表单。
form = TopicForm()#类型为GET,返回一个空表单供用户填写
#创建一个TopicForm实例,赋给变量form
else:#请求方法为POST时,对提交的表单数据进行处理
# POST提交的数据:对数据进行处理
form = TopicForm(data=request.POST)
#使用用户输入的数据(存储在request.POST中)创建一个TopicForm实例,这样form中包含用户提交的信息
if form.is_valid():
#此处检查即将提交保存到数据库的信息是否有效;is_valid()核实用户填写了所有必不可少的字段(表单字段默认都是必不可少的)和输入的数据类型是否与要求的一致
form.save()
#通过验证调用save()将表单中的数据写入数据库
return redirect('noways_app:topics')
#保存数据后离开页面使用redirect('noways_app:topics')将用户的浏览器重定向到topics。
#显示空表单或指出表单数据无效
context = {'form' : form}#通过上下文字典将form这个表单发送给模板
return render(request,'noways_app/new_topic.html',context)
#用新模板渲染页面
4.GET请求和POST请求
- 创建Web程序的两种主要请求类型
- 只是从服务器读取数据的页面--GET请求
- 用户通过表单提交信息--POST请求
- 函数new_topic()将请求对象作为参数-用户初次请求该页面时,浏览器发送GET请求,当用户填写并提交表单时,浏览器发送POST请求
e.模板new_topic
- 创建模板用于显示刚创建的表单:
new_topic.html
{% extends 'noways_app/base.html'}
<!--模板继承base.html-->
{% block content %}
<p>增加一个新的主题:</p>
<form action="{% url 'noways_app:new_topic' %}" method='post'>
<!--定义一个HTML表单,实参action告诉服务器将提交的表单数据发送到视图函数new_topic(),实参method让浏览器以POST请求的方式提交数据-->
{% csrf_token %}
<!--Django使用模板标签“{% csrf_token %}”来防止攻击者利用表单来获得对服务器的非法请求--跨站请求伪造-->
{{ form.as_p }}
<!--显示表单-Django自动创建显示表单所需的全部字段,修饰符as_p让Django以段落格式渲染所有表单元素-->
<button name ='submit'>上传主题</button>
<!--Django不会为表单创建提交按钮,需要自己手动定义-->
</form>
{% endblock content %}
f.链接到页面new_topic
- 在页面topics中添加到页面new_topic的链接
topics.html
{% extends 'noways_app/base.html'}
<!--模板继承base.html-->
{% block content %}
<p>主题:</p>
<ul>
--snip--
</ul>
<a href="{% url 'noways_app:new_topic' %}">新增加一个主题</a>
{% endblock content %}
总结
- 用户点击首页新增一个主题URL模式定向urls.py中查找new_topic-返回视图函数new_topic()前往views.py-->判断请求类型GET/POST-->GET则请求模板new_topic.html--->上传主题后请求类型变为POST,服务器又一次将提交的表单数据发送到视图函数new_topic()--->再次判断结果为POST执行else部分--->检查表单-->表单数据写入数据库--->存数据后离开页面使用redirect('noways_app:topics')将用户的浏览器重定向到topics,显示所有主题
文章评论