2018-10-12 15:24:23

From表单参考连接: https://www.cnblogs.com/yuanchenqi/articles/7614921.html

新增了ModelForm的使用,比Form 更省事更简洁!

越努力越幸运!还有30多天完成把luffycity项目完后面还有其他的flask.爬虫什么的,然后就学完啦!

明天周末,把博客再整理一下!!!!!

把自己的博客项目再优化一下!!!233333333!

越努力,越幸运!永远不要高估自己!

views.py

from django.shortcuts import render,redirect
from .models import *
from django import forms
from django.forms import widgets as wid
from django.forms import ModelForm # 让Model转换成form Meta是配置类
class BookForm(ModelForm):
class Meta:
model = Book
fields = "__all__"
labels = {
"title": "书籍名称",
"price": "价格"
}
# 在特定框里面加入 标签
widgets = {
"title": wid.TextInput(attrs={"class": "form-control"})
"price": wid.TextInput(attrs={"class": "form-control"})
"authors": wid.TextInput(attrs={"class": "form-control"})
}
# 配置错误信息
# error_messages{
# "": ""
# } # 这些等同于 下面原生的 BookForm(forms.Form) 类 """原生的BookForm"""
# 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()) """用原生form表单做的 """
# def addbook(request):
# if request.method=="POST":
# form = BookForm(request.POST)
# 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()) """用ModelForm做的add"""
def addbook(request):
if request.method=="POST":
form = BookForm(request.POST)
if form.is_valid():
form.save()
return redirect("/books/") """原生的form"""
# 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()) """用ModelForm做的edit_books"""
def editbook(request,edit_book_id):
edit_book = Book.objects.filter(pk=edit_book_id).first()
if request.method == "POST":
# 传入个isinstance 对象,让他知道对谁 update
form = BookForm(request.POST, isinstance=edit_book)
if form.is_valid():
form.save()
return redirect("/books/")
form = BookForm(isinstance=edit_book)
return render(request, "edit.html", locals())

add.html和edit_book.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 %} <input type="submit">
</form>
</body>
</html>

笔记

原生form

forms组件

    ChoiceField(Field)

    ModelChoiceField(ChoiceField)

    ModelMultipleChoiceField(ModelChoiceField)

    1 针对form表单设计form组件

modelform

     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") 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())

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

  1. C# HTTP系列10 form表单的enctype属性

    系列目录     [已更新最新开发文章,点击查看详细] 在ASP.NET编程中经常遇到下面的代码片段,将人员信息以表单方式提交到后台程序并保存到服务器与数据库中. <form action=&q ...

  2. form表单验证-Javascript

    Form表单验证: js基础考试内容,form表单验证,正则表达式,blur事件,自动获取数组,以及css布局样式,动态清除等.完整代码如下: <!DOCTYPE html PUBLIC &qu ...

  3. 天河微信小程序入门《四》:融会贯通,form表单提交数据库

    天河在阔别了十几天之后终于又回来了.其实这篇文章里的demo是接着(天河微信小程序入门<三>)后面就做了的,但是因为最近在做别的项目,所以就偷懒没有发出来.放到今天来看,从前台提交数据到数 ...

  4. react引用antd的form表单

    引用form是第三方插件ant插件,官网网址:https://ant.design/.用到的antd的版本是@2.0.1.form(https://ant.design/components/form ...

  5. easyUI中的form表单

    首先创建form表单,并在form表单上创建id便于执行表单验证 <form id="form1"action="" method="post& ...

  6. form表单用ge方式提交时ie显示中文参数乱码

    有网友说 通过给form表单添加accept-charset="gb2312"和 onsubmit="document.charset='gb2312'" 但这 ...

  7. form表单那点事儿(上) 基础篇

    form表单那点事儿(上) 基础篇 做为html中最为常见,应用最广泛的标签之一,form常伴随前端左右.了解更深,用的更顺. 目录: 表单属性 表单元素 常识 模拟外观 表单属性 这个表单展示了fo ...

  8. Html form 表单提交前验证

    可以使用form表单的onsubmit方法,在提交表单之前,对表单或者网页中的数据进行检验. onsubmit指定的方法返回true,则提交数据:返回false不提交数据. 直接看下面的代码: 1 & ...

  9. [原创]java WEB学习笔记62:Struts2学习之路--表单标签:form,表单标签的属性,textfield, password, hidden,submit ,textarea ,checkbox ,list, listKey 和 listValue 属性,select ,optiongroup ,checkboxlist

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. 理解TIME_WAIT

    理解TIME_WAIT http://www.firefoxbug.com/index.php/archives/2795/ 理解TIME_WAIT(2) http://www.firefoxbug. ...

  2. ROS actionlib学习(二)

    在ROS actionlib学习(一)中的例子展示了actionlib最基本的用法,下面我们看一个稍微实际一点的例子,用actionlib计算斐波那契数列,并发布反馈(feedback)和结果(res ...

  3. mysql 5.5.x zip直接解压版 报1076

    到官网下载mysql-5.5.10-win32.zip,然后将mysql解压到任意路径,如:C:\mysql-5.5.10-win32 打开计算机->属性->高级系统设置->环境变量 ...

  4. PC端和移动端在前端开发上的一些区别,前端里移动端到底比pc端多哪些知识

    (1)———————— 前端里移动端到底比pc端多哪些知识,为啥面试时好多公司都问h5水平如何?我做过几年的web前端开发,就简单谈谈自己的感受吧.首先来看看PC端和移动端在前端开发上的一些区别: ( ...

  5. Wifiner for Mac(WiFi 状况分析工具)破解版安装

    1.软件简介    Wifiner 是 macOS 系统上一款 Wifi 分析工具,仅需几次点击即可对您的 Wi-Fi 网络连接进行分析和故障排除.扫描您的 Wi-Fi 网络,获取包含交互式彩色编码热 ...

  6. lua -- 所有UI组件的基类

    -- 组件行为基础 local Behavior = class("Behavior"); function Behavior:ctor(name) self.owner = ni ...

  7. linux每日命令(39):lsof命令

    lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控制协议 ...

  8. Asp.Net 简繁转换

    帮助类 /// <summary> /// 中文字符工具类 /// </summary> public static class ChineseStringUtility { ...

  9. docker内程序如何读取dockerfile和compose.yml中设置的环境变量

    docker内程序如何读取dockerfile和compose.yml中设置的环境变量 背景 compose文件中配置了服务A和服务B,其中B服务调用了A服务的接口,那么B的实现代码中该如何调用A的服 ...

  10. 【转】Ubuntu FireFox无法播放网页视频音乐的解决办法

    原文:http://www.codeweblog.com/%E8%A7%A3%E5%86%B3qq%E9%9F%B3%E4%B9%90%E7%BD%91%E9%A1%B5%E7%89%88%E5%9C ...