Django之form总结
复习Django项目结构:
主要的文件:manage.py,url.py,views.py,settings.py,models.py
manage.py:项目管理文件,一般不做修改。
url.py:路由系统,配置views.py中函数和对应路径的关系。
views.py:添加视图函数,常见的增删查改函数。
settings.py:模板配置文件,对TEMPLATES 、DATABASES、STATIC_URL 等进行配置。
models.py:数据库相关表的类描述。
Django基础必备三件套:HttpResponse, render, redirect
from django.shortcuts import HttpResponse, render, redirect
HttpResponse:内部传入一个字符串参数,返回给浏览器。
render:除request参数外还接受一个待渲染的模板文件和一个保存具体数据的字典参数。将数据填充进模板文件,最后把结果返回给浏览器。
redirect:接受一个URL参数,表示跳转到指定的URL。
参考链接:https://www.cnblogs.com/hxf175336/p/9332409.html
https://www.cnblogs.com/hxf175336/p/9449771.html
表单的处理方式:
常见的三种方式:原生form、form组件、ModelForm组件,以Book表的add为例子分别说明一下这三种方式。
原生form方式:
url.py的代码如下:
from django.conf.urls import url
from django.contrib import admin from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^books/', views.books),
url(r'^book/add', views.addbook),
url(r'^book/edit/(\d+)', views.editbook),
]
models.py的代码如下:
from django.db import models
class Book(models.Model):
title=models.CharField(max_length=32)
price=models.DecimalField(max_digits=8,decimal_places=2) # 999999.99
date=models.DateField()
publish=models.ForeignKey("Publish")
authors=models.ManyToManyField("Author")
def __str__(self):
return self.title
class Publish(models.Model):
name=models.CharField(max_length=32)
def __str__(self):
return self.name
class Author(models.Model):
name=models.CharField(max_length=32)
def __str__(self):
return self.name
views.py的代码如下小:
from django.shortcuts import render,redirect from .models import * #查询
def books(request):
book_list=Book.objects.all() #拿到所有书籍对象
return render(request,"books.html",locals()) #添加
def addbook(request):
if request.method=="POST": #提交到数据库
title=request.POST.get("title")
price=request.POST.get("price")
date=request.POST.get("date")
publish_id=request.POST.get("publish_id")
author_pk_list=request.POST.getlist("author_pk_list") # [1,2]主键关系
#创建添加的书籍对象
book_obj=Book.objects.create(title=title,price=price,date=date,publish_id=publish_id)
book_obj.authors.add(*author_pk_list)#绑定作者关系 return redirect("/books/") publish_list=Publish.objects.all()
author_list=Author.objects.all()
return render(request,"add.html",locals()) #编辑
def editbook(request,edit_book_id):
if request.method=="POST":
title=request.POST.get("title")
price=request.POST.get("price")
date=request.POST.get("date")
publish_id=request.POST.get("publish_id")
author_pk_list=request.POST.getlist("author_pk_list") # [1,2] #更新编辑后的书籍对象内容 Book.objects.filter(pk=edit_book_id).update(title=title,price=price,date=date,publish_id=publish_id)
book_obj=Book.objects.filter(pk=edit_book_id).first()
book_obj.authors.set(author_pk_list)
return redirect("/books/")
edit_book=Book.objects.filter(pk=edit_book_id).first()
publish_list = Publish.objects.all()
author_list = Author.objects.all()
return render(request,"edit.html",locals())
add.html中的内容如下:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h3>添加页面</h3>
<form action="" method="post">
{% csrf_token %}
<p>书籍名称 <input type="text" name="title"></p>
<p>价格 <input type="text" name="price"></p>
<p>日期 <input type="date" name="date"></p>
<p>出版社
<select name="publish_id" id="">
{% for publish in publish_list %}
<option value="{{ publish.pk }}">{{ publish.name }}</option>
{% endfor %} </select>
</p>
<p>作者
<select name="author_pk_list" id="" multiple>
{% for author in author_list %}
<option value="{{ author.pk }}">{{ author.name }}</option>
{% endfor %}
</select>
</p>
<input type="submit">
</form>
</body>
</html>
form组件方式:
url.py和models.py的内容不变,和上一种方式一样。
views.py中多一个form组件类BookForm,通过该类拿到form对象,代码如下:
from django.shortcuts import render,redirect # Create your views here. from .models import * from django import forms
from django.forms import widgets #导入表单装饰器组件 #form组件类
class BookForm(forms.Form):
title = forms.CharField(max_length=32,label="书籍名称")
price = forms.DecimalField(max_digits=8, decimal_places=2,label="价格") # 999999.99
date = forms.DateField(label="日期",
widget=widgets.TextInput(attrs={"type":"date"})
) #gender=forms.ChoiceField(choices=((1,"男"),(2,"女"),(3,"其他")))
#publish=forms.ChoiceField(choices=Publish.objects.all().values_list("pk","title"))
publish=forms.ModelChoiceField(queryset=Publish.objects.all())
authors=forms.ModelMultipleChoiceField(queryset=Author.objects.all()) #查询
def books(request):
book_list=Book.objects.all()
return render(request,"books.html",locals()) #添加
def addbook(request):
if request.method=="POST":
form = BookForm(request.POST) #拿到form对象 if form.is_valid(): print("cleaned_data",form.cleaned_data)
title=form.cleaned_data.get("title")
price=form.cleaned_data.get("price")
date=form.cleaned_data.get("date")
publish=form.cleaned_data.get("publish")
authors=form.cleaned_data.get("authors") # [1,2] #创建要添加的书籍对象 book_obj=Book.objects.create(title=title,price=price,date=date,publish=publish)
book_obj.authors.add(*authors) return redirect("/books/") form=BookForm()
publish_list=Publish.objects.all()
author_list=Author.objects.all()
return render(request,"add.html",locals()) #编辑
def editbook(request,edit_book_id):
if request.method=="POST":
title=request.POST.get("title")
price=request.POST.get("price")
date=request.POST.get("date")
publish_id=request.POST.get("publish_id")
author_pk_list=request.POST.getlist("author_pk_list") # [1,2]
#更新编辑内容 Book.objects.filter(pk=edit_book_id).update(title=title,price=price,date=date,publish_id=publish_id)
book_obj=Book.objects.filter(pk=edit_book_id).first()
book_obj.authors.set(author_pk_list)
return redirect("/books/") edit_book=Book.objects.filter(pk=edit_book_id).first() form=BookForm()
return render(request,"edit.html",locals())
add.html的内容如下:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body> <h3>添加页面</h3> <form action="" method="post" novalidate>
{% csrf_token %}
{% for field in form %}
<div>
{{ field.label }}
{{ field }}
</div>
{% endfor %}
<!--一种表单渲染方式,这种方式相同内容太多
<div>
{{form.title.label }}
{{ form.title }}
</div> <div>
{{form.price.label }}
{{ form.price }}
</div> <div>
{{form.date.label }}
{{ form.date }}
</div> <div>
{{form.publish.label }}
{{ form.publish }}
</div> <div>
{{form.authors.label }}
{{ form.authors }}
</div>
-->
<input type="submit">
</form>
</body>
</html>
ModelForm组件方式:
url.py和models.py的内容不变,和之前的方式一样。
views.py直接调用ModelForm中间件,代码如下:
from django.shortcuts import render,redirect # Create your views here. from .models import * from django.forms import ModelForm
from django.forms import widgets #导入表单装饰器组件 '''
# class Book(models.Model):
#
# title=models.CharField(max_length=32)
# price=models.DecimalField(max_digits=8,decimal_places=2) # 999999.99
# date=models.DateField()
# publish=models.ForeignKey("Publish")
# authors=models.ManyToManyField("Author")
# def __str__(self):
# return self.title #form组件类是根据Book类来设计的
class BookForm(forms.Form):
title = forms.CharField(max_length=32,label="书籍名称")
price = forms.DecimalField(max_digits=8, decimal_places=2,label="价格") # 999999.99
date = forms.DateField(label="日期",
widget=widgets.TextInput(attrs={"type":"date"})
) #gender=forms.ChoiceField(choices=((1,"男"),(2,"女"),(3,"其他")))
#publish=forms.ChoiceField(choices=Publish.objects.all().values_list("pk","title"))
publish=forms.ModelChoiceField(queryset=Publish.objects.all())
authors=forms.ModelMultipleChoiceField(queryset=Author.objects.all()) '''
from django.forms import widgets as wid
class BookForm(ModelForm):
class Meta:
model=Book
fields="__all__"
#fields=["title","price"] labels={
"title":"书籍名称",
"price":"价格",
"date":"日期",
"publish":"出版社",
"authors":"作者",
}
widgets={
"title":wid.TextInput(attrs={"class":"form-control"}),
"price": wid.TextInput(attrs={"class": "form-control"}),
"date": wid.Select(attrs={"class": "form-control","type":"date"}),
"authors": wid.SelectMultiple(attrs={"class": "form-control"}),
}
error_messages={
"title":{"required":"不能为空"}
} #查询
def books(request):
book_list=Book.objects.all()
return render(request,"books.html",locals()) #添加
def addbook(request):
if request.method=="POST":#提交数据
form=BookForm(request.POST)
if form.is_valid():
form.save() #form.model.objects.create(request.POST)
return redirect("/books/")
else:
return render(request, "add.html", locals()) form=BookForm()
return render(request,"add.html",locals()) #编辑
def editbook(request,edit_book_id):
edit_book = Book.objects.filter(pk=edit_book_id).first()
if request.method=="POST":#提交数据
form=BookForm(request.POST,instance=edit_book)
if form.is_valid():
form.save() #edit_book.update(request.POST)
return redirect("/books/") form=BookForm(instance=edit_book)
return render(request,"edit.html",locals())
由于html文件中的重复代码比较多,就写一个form.html文件,其他html文件可以直接调用。
form.html文件的内容如下:
<form action="" method="post" novalidate>
{% csrf_token %}
{% for field in form %}
<div>
{{ field.label }}
{{ field }}
</div>
{% endfor %}
<input type="submit">
</form>
add.html文件的内容:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<!--最新版本的Bookstrap核心CSS文件,使样式好看点-->
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
</head>
<body>
<h3>添加页面</h3>
<div class="row">
<div class="col-lg-4 col-md-offset-3">
{% include 'form.html' %}<!--直接引用form.html文件内容,就能不需要重复写了-->
</div>
</div> </body>
</html>
Django之form总结的更多相关文章
- Django之Form组件
Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ...
- Django models Form model_form 关系及区别
Django models Form model_form
- 【Django】--Form组件
Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 例子: 1.创建Form类 from djan ...
- Django基础——Form&Ajax篇
一 Form 在实际的生产环境中,登录和注册时用户提交的数据浏览器端都会使用JavaScript来进行验证(比如验证输入是否为空以及输入是否合法),但是浏览器可能会禁用JavaScirpt,同时也有人 ...
- Python之路【第二十一篇】:Django之Form组件
Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1. ...
- 第十一篇:web之Django之Form组件
Django之Form组件 Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功 ...
- 69、django之Form组件
本篇导航: 小试牛刀 Form类 常用选择插件 自定义验证规则 初始化数据 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次 ...
- Django的Form(二)
上一篇已经简单介绍了Django的Form,现在开始进阶操作了 ..... 创建Form类的时候,主要涉及到Form字段和Form的插件,字段用于做form验证,插件用来生成HTML DjiangoF ...
- Django的Form
Django的Form有两个基本用途: 1.用于生成html的Form表单 2.用于后台做表单验证 #!/usr/bin/env python # -*- coding:utf-8 -*- impor ...
- python Django之Form组件
python Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试 ...
随机推荐
- LeetCode--No.013 Roman to Integer
13. Roman to Integer Total Accepted: 95998 Total Submissions: 234087 Difficulty: Easy Given a roman ...
- Servlet-转发和重定向的区别
实际发生位置不同,地址栏不同 转发是发生在服务器上的 转发是由服务器进行跳转的,细心的朋友会发现,在转发的时候,浏览器的地址栏是没有发生变化的,在我访问Servlet111的时候,即使跳转到了Serv ...
- keras中的mini-batch gradient descent (转)
深度学习的优化算法,说白了就是梯度下降.每次的参数更新有两种方式. 一. 第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度.这种方法每更新一次参数都要把数据集里的所有样本都看 ...
- 从零开始学 Web 之 DOM(七)事件冒泡
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... +-------------------------------------------------------- ...
- 最好用的lua编辑器--------emmylua使用汇总
最好的lua编辑器Emmylua,欢迎打脸 官方文档 https://emmylua.github.io/zh_CN/ github https://github.com/EmmyLua ...
- redis.properties
#### env:${env} redis.maxIdle= ##最小空闲数 redis.minIdle= ##最大连接数:能够同时建立的“最大链接个数” redis.maxTotal= #每次最大连 ...
- Docker容器的创建、启动、和停止
1.容器是独立运行的一个或一组应用,及他们的运行环境.容器是Docker中的一个重要的概念. 2.docker容器的启动有三种方式a.交互方式,基于镜像新建容器并启动例如我们可以启动一个容器,打印出当 ...
- FC游戏 《三国志2-霸王的大陆》攻略
<三国志2-霸王的大陆>是日本南梦宫公司研发的一款历史战略模拟游戏,于1992年06月10日在红白机平台上发行. 在开始游戏选择君主时(一定要在君主未出现前的画面时进行第二步),按住1P的 ...
- 实验吧 burpsuie拦截修改请求
Forbidden 解题链接:http://ctf5.shiyanbar.com/basic/header/ 把language改成zh-hk,go,flag到手 Forms 题目地址:http:// ...
- JavaWeb学习 (十二)————使用Session防止表单重复提交
在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...