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提交保留上次提交数据 初始化页面显示内容 小试 ...
随机推荐
- Java内部类持有外部类的引用详细分析与解决方案
在Java中内部类的定义与使用一般为成员内部类与匿名内部类,他们的对象都会隐式持有外部类对象的引用,影响外部类对象的回收. GC只会回收没有被引用或者根集不可到达的对象(取决于GC算法),内部类在生命 ...
- Spark之submit任务时的Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory
Spark submit任务到Spark集群时,会出现如下异常: Exception 1:Initial job has not accepted any resources; check your ...
- ajaxFileUpload带参数提交(亲测可用)
使用ajaxFileUpload上传文件时,有时需要带参数提交,网上有很多资料说使用data,但其实要使用data带参数是需要修改的,否则后台是获取不到的. 分析原因: ajaxFileUpload为 ...
- c time类型详解
linux下存储时间常见的有两种存储方式,一个是从1970年01月01日 0:00:00到现在经过了多少秒,一个是用一个结构来分别存储年月日时分秒的.time_t 这种类型就是用来存储从1970年到现 ...
- DenseNet 论文阅读笔记
Densely Connected Convolutional Networks 原文链接 摘要 研究表明,如果卷积网络在接近输入和接近输出地层之间包含较短地连接,那么,该网络可以显著地加深,变得更精 ...
- #10 Python字符串
前言 通过上一节可知,Python6个序列的内置类型中,最常见的是列表和元组,但在Python中,最常用的数据类型却不是列表和元组,而是字符串.要想深入了解字符串,必须先掌握字符编码问题.因此本篇博文 ...
- [BZOJ 4671]异或图
Description 题库链接 给定 \(s\) 个结点数相同且为 \(n\) 的图 \(G_1\sim G_s\) ,设 \(S = \{G_1, G_2,\cdots , G_s\}\) ,问 ...
- 自定义Fiddler插件一
上个月自定义了一个Fiddler的插件,可以根据请求生成接口自动化测试的RF和Python代码,这样测试人员只需要手动操作页面用Fiddler抓取报文,就可以直接生成RF.Python代码,然后只需要 ...
- [转]JS实现千分位
本文转自:https://www.cnblogs.com/lvmylife/p/8287247.html 方法一:正则实现 function format (num) { var reg=/\d{1, ...
- 【Core】创建简单的Core MVC项目
创建项目: 首先:打开vs选中新建项目- >选中.NET Core - >ASP.NET Core Web应用程序: 然后:在选择web应用程序,注意上面要选中.net Core 别选错了 ...