一. Django ModelForm组件
https://download.csdn.net/download/baobao267/10722491 Django之Form表单验证及Ajax验证方式汇总
https://www.jianshu.com/p/1c65fa4a6ca7 ModelForm和form区别使用
https://blog.csdn.net/weixin_34179762/article/details/93371564 ModelForm操作及验证
首先导入ModelForm from django.forms import ModelForm 在视图函数中,定义一个类,比如就叫StudentList,这个类要继承ModelForm,在这个类中再写一个原类Meta(规定写法,并注意首字母是大写的) 在这个原类中,有以下属性(部分)
class StudentList(ModelForm): class Meta: model = models.Student #对应的Model中的类 fields = "__all__" #字段,如果是__all__,就是表示列出所有的字段 exclude = None #排除的字段 labels = None #提示信息 help_texts = None #帮助提示信息 widgets = None #自定义插件 error_messages = None #自定义错误信息 #error_messages用法: error_messages = { 'name':{'required':"用户名不能为空",}, 'age':{'required':"年龄不能为空",}, } #widgets用法,比如把输入用户名的input框给为Textarea #首先得导入模块 from django.forms import widgets as wid #因为重名,所以起个别名 widgets = { "name":wid.Textarea(attrs={"class":"c1"}) #还可以自定义属性 } #labels,自定义在前端显示的名字 labels= { "name":"用户名" }
二. ModelForm使用案例
https://www.cnblogs.com/hnlmy/p/9526720.html 案例
model from django.db import models # Create your models here. 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",on_delete=models.CASCADE) 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 from django.shortcuts import render,redirect # Create your views here. from .models import * from django import forms from django.forms import widgets from django.forms import ModelForm ''' class BookForm(forms.Form): email=forms.EmailField() 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__" # 对Book表中所有字段转换渲染到页面上 # fields = ["title","price"] # 对Book表中title price字段转换渲染到页面上 labels={"title":"书籍名称:", "price":"价格:"} widgets={ "title":wid.TextInput(attrs={"class":"form-control"}), "price":wid.TextInput(attrs={"class":"form-control"}), "date":wid.TextInput(attrs={"class":"form-control","type":"date"}), "publish":wid.Select(attrs={"class":"form-control"}), "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) 保存添加的数据到mysql中 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())
templates
form.html <form action="" method="post" novalidate> {% csrf_token %} {% for field in form %} <div> {{ field.label }} {{ field }} <span>{{ field.errors.0 }}</span> </div> {% endfor %} <input type="submit"> </form>
books.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> <a href="/book/add"><button>添加书籍</button></a> <hr> <table border="1"> {% for book in book_list %} <tr> <td>{{ book.title }}</td> <td>{{ book.price }}</td> <td>{{ book.date|date:"Y-m-d" }}</td> <td>{{ book.publish.name }}</td> <td>{{ book.authors.all }}</td> <td><a href="/book/edit/{{book.pk}}"><button>编辑</button></a></td> </tr> {% endfor %} </table> </body> </html>
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"> <!-- 最新版本的 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> </head> <body> <h3>添加页面</h3> <div class="row"> <div class="col-md-4 col-md-offset-3"> {% include 'form.html' %} </div> </div> </body> </html>
edit.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> {% include 'form.html' %} </body> </html>