使用表单

表单用 user 提交数据,是网站中比较重要的一个内容

GET 和 POST 方法

GET 和 POST 的区别

URL,全称是"统一资源定位符"。用于对应互联网上的每一个文件。而 GET、POST 等方法,本质上就是对这个 URL 进行一系列的操作。GET、POST、PUT、DELETE 分别对应对资源进行查、改、增、删。因此,任何对系统状态有改变的请求(例如,对数据库的数据进行修改)都应该使用 POST 。GET 方法用于不影响系统状态的请求,如搜索或者是请求发送一些数据。

在 Django 中,使用 GET 和 POST 方法来处理表单

  • Django 中的登陆表单就是使用 POST 方法的,浏览器会将表单数据打包,发送给服务器,并返回一个 response

  • 而 GET 方法则是将要提交的数据做为键值对提交的网址结合起来生成一个 URL,例如:

https://docs.djangoproject.com/search/?q=forms&release=1.

Django 为 Form 提供的功能

  1. 为渲染准备和重组数据

  2. 为数据创建 HTML 表单

  3. 对用户提交上来的数据和表单进行接收和处理

表单类

Django 拥有一个 Form 类。负责描绘表单,决定表单如何工作和呈现。

处理思路:

  1. 一般单独建立一个 Form.py 的文件进行编写。

  2. 当我们处理表单的时候,应该在 views 中实例化它。

表单类的 fileds 与 HTML 中的<input>元素形成映射

  from django import forms
 
 class NameForm(forms.Form):
     #label标签决定input前面的label内容是什么。max_length限制输入数据的长度,Django会对其进行检查
     your_name = forms.CharField(label='Your name', max_length=100)
     #生成一个输入密码,widget定义字段在表单中以何种html元素出现,加入attrs,则可以为input增加css类,方便使用bootstrap框架
     password = forms.CharField(widget=forms.PasswordInput(attrs={'class': 'form-control'}))
     #生成一个Textarea,required表示字段必须填写,默认开启
     message = forms.CharField(widget=forms.Textarea,required=False)
     #生存一个checkbox
     cc_myself = forms.BooleanField(required=False)

我们可以直接在 HTML 文件中使用 {{ form}}来插入表单,注意,form类生成的代码不包括<form>标签本身以及提交按钮。方便自己插入 css,js或bootstrap框架等

<form action="/your-name/" method="post">
   <--! 使用post方法的时候,必须加上下面这一句 -->
  {% csrf_token %}
  {{ form }}
   <input type="submit" value="Submit" />
</form>

上面定义的类生成的 HTML 代码为:

<p><label for="id_subject">your_name:</label>
   <input id="id_your_name" type="text" name="subject" maxlength="" required /></p>
<p><label for="id_message">Message:</label>
   <textarea name="message" id="id_message" required></text

Django自动为每个input元素设置了一个id名称,对应label的for参数。for属性可把label绑定到另外一个元素上。

每个 Form 实例拥有一个 is_valid() 方法,它对所有字段进行认证,如果所有字段均有效,它将返回 True ,并且将表单的数据放入 cleaned_data 的属性中。

在 views 中使用表单类的一个例子

  from django.shortcuts import render
 from django.http import HttpResponseRedirect

 from .forms import NameForm

 def get_name(request):
     # 如果form通过POST方法发送数据
     if request.method == 'POST':
         # 创建一个表单实例并通过request.POST中的数据对实例赋值
         form = NameForm(request.POST)
         # 检查表单数据是否有效:
         if form.is_valid():
             # 在form.cleaned_data['属性名']中找到响应数据,并用来更新数据库或进行其他处理
             # ...
             # redirect to a new URL:
             return HttpResponseRedirect('/thanks/')
     
     #当用户点击首页登陆按钮跳转到登陆界面的时候,通过GET方法请求数据,这时候就返回一个空的表单,让用户进行填写。
     else:
         form = NameForm()
     
     return render(request, 'name.html', {'form': form})

手动渲染表单字段

当我们需要对表单内的input元素进行额外的控制,如加入css或者引入Bootstrap框架时候,直接用{{ form }}就不行了。这时候可以通过{{ form.name_of_field }}获取表单的每一个字段,然后分别渲染。

{{ form.non_field_errors }}
<div class="fieldWrapper">
  {{ form.subject.errors }}
   <label for="{{ form.subject.id_for_label }}">Email subject:</label>
  {{ form.subject }}
</div>
<div class="fieldWrapper">
   < --! 返回表单的错误信息 -- >
  {{ form.message.errors }}
   <label for="{{ form.message.id_for_label }}">Your message:</label>
  {{ form.message }}
</div>

label标签可以用 label_tag 生成。

<div class="fieldWrapper">
{{ form.subject.errors }}
{{ form.subject.label_tag }}
{{ form.subject }}
</div>

使用模型表单 ModelForm (常用于注册和填写资料界面)

django 提供一个 ModelForm 类,可以利用 model 创建 form。注意,这里的 form 类的数据 要求在数据库里没有相同的元素。否则不能通过is_vaild()验证

用法的核心是:

  1. 首先从django.forms导入ModelForm;从 app 中导入模型类

  2. 编写一个自己的类,继承ModelForm;

  3. 在新类里,设置元类Meta;

  4. 在Meta中,设置model属性为你要关联的ORM模型;

  5. 在Meta中,设置fields属性为你要在表单中使用的字段列表;

  6. 列表里的值,应该是ORM模型model中的字段名。

  7. 在视图里创建一个form类之后,通过实例.save()的方法赋值给 model 类,然后模型实例.save()就可以保存了。

 from django.forms import ModelForm
from myapp.models import Article

# 创建表单类
class ArticleForm(ModelForm):
    class Meta:
        model = Article
        fields = ['pub_date', 'headline', 'content', 'reporter']

当想对某些字段进行自定义的时候,可以显式地声明或指定这些性质,就像在普通表单中一样。如:user_name = forms.CharField(label='用户名', max_length=20)

也可以使用如下方法:

from django.forms import ModelForm, Textarea
from myapp.models import Author

class AuthorForm(ModelForm):
   class Meta:
       model = Author
       fields = ('name', 'title', 'birth_date')
       widgets = {
           'name': Textarea(attrs={'cols': 80, 'rows': 20}), # 关键是这一行
      }
       labels = {
           'name': _('Writer'),
      }
       help_texts = {
           'name': _('Some useful help text.'),
      }
       error_messages = {
           'name': {
               'max_length': _("This writer's name is too long."),
          },
      }

Django中使用表单的更多相关文章

  1. ASP.NET MVC中使用表单上传文件时的注意事项

    最近了好久没写ASP.NET 使用HTML的FORM来上传文件了,结果写了个文件上传发现ASP.NET MVC的Controller中老是读取不到上传的文件. MVC的View(Index.cshtm ...

  2. Django中对单表的增删改查

    之前的简单预习,重点在后面 方式一: # create方法的返回值book_obj就是插入book表中的python葵花宝典这本书籍纪录对象   book_obj=Book.objects.creat ...

  3. Django中实现单表和多表接口

    基础接口 序列化:course/serializers.py from rest_framework import serializers from .models import CourseCate ...

  4. (转)html中使用表单和input file上传图片

    本文转载自:http://hi.baidu.com/love_1210/item/120e452b42b2a854c38d59eb 客户端代码: <form name="form1&q ...

  5. element-ui中使用表单验证的问题

    <el-form ref="ruleRules" :inline="true" :model="ruleInfo"> <e ...

  6. Django中manger/QuerySet类与mysql数据库的查询

    Django中的单表操作 1.精确查询 #查询的结果返回是容器Query Set的函数(Query Set模型类)​# 1. all()   查询的所有的符合条件的结果,支持正向索引,支持索引切片,不 ...

  7. django使用表单

    假设你想从表单接收用户名数据,一般情况下,你需要在HTML中手动编写一个如下的表单元素: <form action="/your-name/" method="po ...

  8. 第四章:Django表单 - 1:使用表单

    假设你想从表单接收用户名数据,一般情况下,你需要在HTML中手动编写一个如下的表单元素: <form action="/your-name/" method="po ...

  9. ASP.NET Core 中文文档 第四章 MVC(3.4)如何使用表单

    原文:Working with Forms 作者:Rick Anderson.Dave Paquette.Jerrie Pelser 翻译:姚阿勇(Dr.Yao) 校对:孟帅洋(书缘) 这篇文章演示了 ...

随机推荐

  1. k8s的Pod控制器

    pod的配置清单常见选项: apiVersion,kind,metadata,spec,status(只读) spec: containers: nodeSelector: nodeName: res ...

  2. 转载:将画布(canvas)图像保存成本地图片的方法

    之前我曾介绍过如何将HTML5画布(canvas)内容转变成图片形式,方法十分简单.但后来我发现只将canvas内容转变成图片输出还不够,如何能将转变后的图片保存到本地呢? 其实,这个方法也是非常简单 ...

  3. 记一次header跨域与cookie共享

       最近把左边的传统模式,换成了右边通过js直接调api拿数据并渲染,于是变出现了ajax的跨域问题:XMLHttpRequest cannot load http://api.abc.com/?s ...

  4. 【linux】 服务器文件说明

    文件名 说明 /etc/resolv.conf  域名解析服务器地址文件 /etc/services 服务程序对应端口号文件 /etc/passwd 登录账号文件 /etc/hosts 本地IP域名解 ...

  5. 关于host,nslookup,dig 的安装

    host,nslookup,dig依赖bind包,所以先看一下系统有没有bind包 命令如下:rpm -qa |grep bind 如果没有或者版本太低请升级安装 命令是:yum install bi ...

  6. Educational Codeforces Round 53 (Rated for Div. 2) C Vasya and Robot 二分

    题目:题目链接 思路:对于x方向距离与y方向距离之和大于n的情况是肯定不能到达的,另外,如果n比abs(x) + abs(y)大,那么我们总可以用UD或者LR来抵消多余的大小,所以只要abs(x) + ...

  7. HDU 5525 Product 数论

    题意: 给出一个长度为\(n(1 \leq n \leq 10^5)\)的序列\(A_i\),\(N=\prod\limits_{i=1}^{n}i^{A_i}\).求\(N\)的所有约数的乘积. 分 ...

  8. Python虚拟机之异常控制流(四)

    Python虚拟机中的异常控制流 先前,我们分别介绍了Python虚拟机之if控制流(一).Python虚拟机之for循环控制流(二)和Python虚拟机之while循环控制结构(三).这一章,我们来 ...

  9. dubbo rpc filter实现剖析(二)

    2.6.3版本,之前读的是2.4.9版本 本篇主要阐述dubbo rpc的filter的实现,包括作用,用法,原理,与Spring Cloud在这些能力的对比. 整个filter列表的获取过程在 co ...

  10. dev c++ 提示没有iostream.h文件

    dev c++ 提示没有iostream.h文件 解决办法路径没有打通最好是这样写:#include <iostream>using namespace std;int main(int ...