第十九章用户账户-让用户输入数据

本章目标

Web应用程序的核心是让任何用户都能够注册账户并能够使用它,不管用户身处何方。

  •  创建基本表单让用户能够添加编辑主题和条目
  • 防范黑客攻击
  • 用户身份验证系统

 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,显示所有主题

版权声明:
作者:RHZ
链接:https://www.rhzhz.cn/?p=230
来源:RHZ | 用文字记录工作和学习生活
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
海报
第十九章用户账户-让用户输入数据
本章目标Web应用程序的核心是让任何用户都能够注册账户并能够使用它,不管用户身处何方。  创建基本表单让用户能够添加编辑主题和条目 防范黑客攻击 ……
<<上一篇
下一篇>>