modelForm 组件
概念
将数据库与form 组件结合用起来的中间插件
与 form 组件的区别
form组件的难处:
form 可以实现 对数据的验证以及 form 的表单标签的生成
但是她做不到一点就是无法将数据库串联起来,无法做到数据的传回
比如编辑页面的时候无法拿到当前正要被编辑的值
modelfom 组件在 form组件的基础上进行升级 :
自动创建 form 类 (将model类 转换成 form类)
在 from类手动创建的是时候就可以发现,form 的创建和 model 的数据库几乎完全一致
而modelform 可以帮我们直接实现这个操作而不在需要手动创建
直接和 model 对应上,对于 model 的增删改查会更加的简单便捷
创建关联
用form 组件的形式创建
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"}) ) publish=forms.ModelChoiceField(queryset=Publish.objects.all()) authors=forms.ModelMultipleChoiceField(queryset=Author.objects.all())用modelform 组件的形式创建
class BookForm(ModelForm): class Meta: model=Book # 制定要被转换的表 fields="__all__" # 控制要被转换的字段 , __all__ 表示所有字段 ,除了 用 __all__ 的时候对多个字段使用的时候用列表的形式 # fields=["title","price"] # 除了 用 __all__ 的时候用字符串形式,对多个字段使用的时候用列表的形式一些比较常见的仓鼠:
from django.forms import ModelForm #在视图函数中,定义一个类,比如就叫StudentList,这个类要继承ModelForm,在这个类中再写一个原类Meta(规定写法,并注意首字母是大写的) #在这个原类中,有以下属性(部分): class StudentList(ModelForm): class Meta:
model =Student #对应的Model中的类 fields = "__all__" #字段,如果是__all__,就是表示列出所有的字段 exclude = 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":"用户名" }
数据传回
对当前编辑的对象的数据的取回,在form 组件的时候是无法操作的
form 类在实例化对象的时候无法接受参数
modelform 组件可以 以instance参数接受一个对象
save 的使用
对于数据的编辑更新和新建,modelform 类统一使用 .save() 方法
当 当前的 modelform 对象中没有 instance参数的时候默认添加一个新对象
当 当前的 modelform 对象中有 instance参数的时候会按照参数的中的对象进行更新操作
(不给对象参数的话怎么知道要编辑哪一个呢?)
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())