Django的form表单

时间:2021-11-26 19:17:26

html的form表单

django中,前端如果要提交一些数据到views里面去,需要用到 html里面的form表单。

例如:

# form2/urls.py

from django.contrib import admin
from django.urls import path,re_path
from django.conf.urls import include
from . import views
urlpatterns = [
re_path(r'^home$', views.home),
re_path(r'^login$', views.login),
]

# views.py

from django.shortcuts import render,HttpResponse
def login(request):
return render(request, 'form2/login.html')

# login.html

<form action="/form2/home" method="post">   #向这个页面发送post请求,action配置目标地址
<p>用户名:<input type="text" name="username"></p> #name表示key,value等于input输入的内容
<input type="submit" value="提交">
</form>

第二种方法: 使用url_name

login.html  <form action="{% url 'homepage' %}" method="post">           
app.urls
urlpatterns = [
re_path(r'^home$', views.home,name='homepage'), #url命名
re_path(r'^login$', views.login),
]
第三种方法:使用namespace命名空间 (作用:当有多个app.urls时,如果存在重复的name,容易引起混乱,这时候需要引入namespace)
login.html      action="{% url 'app_name:url_name' param %}"       #param参数,没有就不写
<form action="{% url 'app_form2:homepage' %}" method="post">
根urls
path('form2/', include('form2.urls',namespace='aaaa')), #namespace必须有值,值好像可随便取~

app.urls

app_name = 'app_form2'     #django2.0之后必须写此项,否则会报错
urlpatterns = [
re_path(r'^home$', views.home, name='homepage'), #url_name

# form2/views.py

from django.shortcuts import render,HttpResponse
def login(request):
return render(request, 'form2/login.html')
def home(request):
username = request.POST.get('username') or 'lily' #前端form表单传过来的username数据,如果为空则默认为'lily'
return render(request, 'form2/homepage.html', {"username":username}) #将username传给homepage.html

# homepage.html

<body>
welcome, {{username}}! # views传过来的username变量
</body>

访问 http://127.0.0.1:8000/form2/login

Django的form表单

提交之后,login页面会跳转到/form2/home页面

Django的form表单

Django的form表单

主要作用是1,生成html标签,2,表单验证。

#  新建forms.py ,定义表单字段类型

from django import  forms
class Person_Info(forms.Form):
name = forms.CharField(max_length=4) # 字符串类型,最长不超过4个字符
birthday = forms.DateField() #日期类型
email = forms.EmailField(required=False) # required=False表示可以为空,默认是True,不能为空
phone = forms.IntegerField() #数值类型

#  views.py

from django.shortcuts import render,HttpResponse
from .forms import Person_Info #导入form表单
def person(request):
person_obj = Person_Info() # 创建了这个对象
return render(request,'form2/info.html',{'obj':person_obj}) #然后把对象传给html

info.html

<form action=""  method="post">
{% csrf_token %} # django自带的csrf验证,不加提交时会报错
{{ obj }} # views传的对象, 可以自动创建html标签
<div>姓名:{{ obj.name }}</div> # 也可以单独取对象中的某一个字段
<!--<div>生日:{{ obj.birthday }}</div>-->
<!--<div>邮箱:{{ obj.email }}</div>-->
<!--<div>手机号:{{ obj.phone}}</div>-->
<input type="submit" value="提交">
</form>

csrf_token如果不加上,提交表单会报错

Django的form表单

或者在settings里面注释掉'django.middleware.csrf.CsrfViewMiddleware', 这行也可以。

访问 http://127.0.0.1:8000/form2/info可以看到生成的表单。体现了django的form的第一个作用,即自动生成html标签,如下:

Django的form表单

Django的form表单

填入数据的时候,如果数据不合法,就会有提示。

这样在后端就可以验证,如果字段合法,就获取数据操作,如果不合法,就返回错误信息。

验证用户输入

views.py

from django.shortcuts import render
from .forms import Person_Info
def person(request):
form_obj = Person_Info()
if request.method == 'POST': #获取用户输入
print("request.POST:", request.POST)
form_obj = Person_Info(request.POST) #将post过来的数据当做参数传给Person_Info这个form表单,将name,birthday,email等封装到form_obj,判断输入是否合法
print("form is valid:", form_obj.is_valid()) # 通过is_valid()方法判断表单数据是否合法
return render(request, 'form2/info.html', {"obj": form_obj})

这里我输入一个不合法的birthday,可以看到:

Django的form表单

Django的form表单

增加一个判断,如果填写的表单正确,返回表单数据,如果不合法,返回错误信息。

from django.shortcuts import render,HttpResponse
from .forms import Person_Info
def person(request):
form_obj = Person_Info()
if request.method == 'POST':
form_obj = Person_Info(request.POST)
if form_obj.is_valid():
print("form is valid ^_^** ", form_obj.cleaned_data) # 返回表单数据,是字典形式
username = form_obj.cleaned_data.get('name') #取出填写的name的值
if username == 'lily':
return HttpResponse('*lily*')
else:
errors = form_obj.errors
print("form is invalid T_T... ", errors) # .errors 获取错误信息
return render(request, 'form2/info.html', {'obj': form_obj, 'errors': form_obj.errors })
return render(request, 'form2/info.html', {'obj': form_obj})

info.html

<form action="/form2/info" method="post">
{% csrf_token %}
{% for i in obj %}
<div>{{ i.name }} {{ i }} {{ i.errors }} </div> # i.name获取每个字段的名字,i.errors获取错误信息
{% endfor %}
<input type="submit" value="提交">
</form>

测试,输入一个非法的:

Django的form表单

Django的form表单

输入一个正确的:

Django的form表单

ModelForm

因为models和form都能定义数据类型,如果想要数据库里的数据展示在前端,那么可以使用modelform,省去form定义字段类型。

例如:我已有了Article数据表。想要创建一个允许人们写文章的表单

from django.db import models
class Article(models.Model):
title = models.CharField(max_length=32,default='Title')
content = models.TextField(null=True)
def __str__(self):
return self.title

myblog/models.py

# forms.py

from django import forms
from django.forms import ModelForm
from myblog import models # 导入myblog.models数据表
class Article_Model_Form(forms.ModelForm): #继承ModelForm类
class Meta:
model = models.Article #导入数据表
fields = ['title', 'content'] #要使用的字段
exclude = () #排除字段

# views.py

from .forms import Article_Model_Form
def article_modelform(request):
form = Article_Model_Form() #创建一个表单来添加一条数据
if request.method == 'POST':
form = Article_Model_Form(request.POST)
if form.is_valid(): # 判断表单是否合法
print("form is ok", form.cleaned_data)
form.save() # 将合法的数据保存到数据表中
else:
error_msg = form.errors
return render(request, 'form2/article.html', {"article_form": form ,"errors": error_msg})
return render(request, 'form2/article.html', {"article_form": form})

# article.html

<form action="" method="post">
{{ article_form }}
<input type="submit" value="提交">
</form>

在表单填入 Django的form表单

可以从后台看到,数据创建成功。

Django的form表单

Django的form表单的更多相关文章

  1. Django 11 form表单(状态保持session、form表单及注册实现)

    Django 11 form表单(状态保持session.form表单及注册实现) 一.状态保持 session 状态保持 #1.http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状 ...

  2. 转载:Django之form表单

    转载: 一.使用form类创建一个表单 先定义好一个RegForm类: forms.py from django import forms # 导入forms类 class NameForm(form ...

  3. Django--分页器(paginator)、Django的用户认证、Django的FORM表单

    分页器(paginator) >>> from django.core.paginator import Paginator >>> objects = ['joh ...

  4. django之form表单验证

    django中的Form一般有两种功能: 输入html 验证用户输入 #!/usr/bin/env python # -*- coding:utf- -*- import re from django ...

  5. django中form表单的提交:

    一,关于表单: 表单在百度百科的解释:   表单在网页中主要负责数据采集功能.一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法. 表单域 ...

  6. Day19 Django之Form表单验证、CSRF、Cookie、Session和Model操作

    一.Form表单验证 用于做用户提交数据的验证1.自定义规则 a.自定义规则(类,字段名==html中的name值)b.数据提交-规则进行匹配代码如下: """day19 ...

  7. Django的form表单之文件上传

    在生成input标签的时候可以指定input标签的类型为file类型 <!DOCTYPE html> <html lang="en"> <head&g ...

  8. 【django之form表单】

    一.构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字.你需要类似这样的模板: <form action="/your-name/" method=&qu ...

  9. Django 提交 form 表单&lpar;使用sqlite3保存数据&rpar;

    优化 提交 form 表单,https://www.cnblogs.com/klvchen/p/10608143.html 创建数据库的字段,在 models.py 中添加 from django.d ...

随机推荐

  1. OSG的节点访问

    OSG的节点访问 转自:http://www.cnblogs.com/kanego/archive/2011/09/27/2193484.html SG中节点的访问使用的是一种访问器模式. 一个典型的 ...

  2. SQL Server 2008创建oracle链接服务器(心得)

    操作系统是32位的情况下,曾经没费太多时间创建好了到oracle的链接服务器.主要要点就是: 1.安装oracle精简客户端.当时我用的是版本比较低的“oracle9i310-客户端简化版”,安装好了 ...

  3. Model--汇总

    NSFileManager.NSURL.NSFileHandle.NSData.NSXMLParser.NSUserDefaults.NSKeyedArchiver.NSKeyedUnarchiver ...

  4. oracle进制转换

    h2 { margin-top: 0.46cm; margin-bottom: 0.46cm; direction: ltr; line-height: 173%; text-align: justi ...

  5. System&period;Web&period;Http&period;Tracing 在webapi里面应用

    最近想写log.再接口里面 所以就想到了.net 4.0提供的这个类. 整好.配合asp.net api好使用 ,而且 本地调试会在 vs Output 里面输出. 1.开启这个Tracing con ...

  6. RMAN的show&comma;list&comma;crosscheck&comma;delete命令

    1.SHOW命令:      显示rman配置: RMAN> show all; 2.REPORT命令: 2.1.RMAN> report schema 报告目标数据库的物理结构; 2.2 ...

  7. html绑定

    目的 html绑定可以绑定DOM元素内的HTML内容. 示例: <div data-bind="html: details"></div> <scri ...

  8. JQuery中的相反的地方

    1.on和delegate的参数顺序相反 2.each和map参数也是相反的

  9. 转:禁止360随身wifi驱动自动安装

    from:http://bbs.360safe.com/thread-2643500-1-1.html 有曾经数次卸载随身wifi后,插上又会自动安装随身wifi驱动的,也可以看看下面的解决办法. 卸 ...

  10. js类型转换比较表格

    JavaScript类型转换表格  值 转换为         字符串 数字 布尔值 对象 undefined "undefined" NaN false throw TypeEr ...