from django import forms
from app01 import models
class BookModelForm (forms.ModelForm):
class Meta :
model = models.Book
fields = "__all__"
widgets = {
"publish_date" : forms.widgets.DateInput(
attrs={"type" : "date" }
)
}
labels = {
"title" : "书名" ,
"price" : "价格" ,
"publish_date" : '出版日期' ,
"publisher" : "出版社名称" ,
"authors" : "作者"
}
error_messages = {
"title" : {
"required" : "书名不能为空"
}
}
def __init__ (self, *args, **kwargs ):
super (BookModelForm, self).__init__(*args, **kwargs)
for field in iter (self.fields):
self.fields[field].widget.attrs.update({
'class' : 'form-control'
})
class Meta :
model,
fields=None ,
exclude=None ,
labels=None ,
help_texts=None ,
widgets=None ,
error_messages=None ,
field_classes=None
localized_fields=('birth_date' ,)
model_form_obj = XXOOModelForm ()
model_form_obj.is_valid ()
model_form_obj.errors.as_json ()
model_form_obj.clean ()
model_form_obj.cleaned_data
def add_book (request ):
if request.method == "POST" :
form_obj = forms.BookModelForm(request.POST)
if form_obj.is_valid():
form_obj.save()
return redirect("/book_list/" )
form_obj = forms.BookModelForm()
return render(request, "v2/add_book.html" , locals ())
def edit_book (request, pk ):
book_obj = models.Book.objects.filter (id =pk).first()
form_obj = forms.BookModelForm(instance=book_obj)
return render(request, "v2/edit_book.html" , locals ())
ModelForm用于更新 :ModelForm(request.POST, instance=book_obj)
def edit_book (request, pk ):
book_obj = models.Book.objects.filter(id=pk).first()
if request.method == "POST" :
#修改数据时,直接可以将用户数据包request.POST传进去,
#再传一个要修改的对象的示例,ModelForm就可以自动完成修改数据了。
form_obj = forms.BookModelForm(request.POST, instance=book_obj)
if form_obj.is_valid():
form_obj.save()
return redirect("/book_list/" )
#form_obj通过instance设置初始化的值,例如,图书管理系统中的编辑书籍功能,
#点击编辑后跳转到编辑书籍页面,跳转后需要用要编辑的书籍信息填充页面对应信息。
#不同于Form组件的是,ModelForm直接就可以传实例化的对象,而不需要将对象转化成字典的形式传。
form_obj = forms.BookModelForm(instance=book_obj)
return render(request, "v2/edit_book.html" , locals())
ModelForm ---- 中小型应用程序。因为ModelForm是依赖于models的。
Form ------- 大型应用程序
表结构:
from django.db import models
class Publisher (models .Model ):
name = models.CharField(max_length=12 )
address = models.TextField()
def __str__ (self ) :
return self .name
class Author (models .Model ):
name = models.CharField(max_length=12 )
gender = models.SmallIntegerField(
choices=((0 , '女' ), (1 , '男' ), (2 , '保密' ))
)
age = models.IntegerField()
def __str__ (self ) :
return self .name
class Book (models .Model ):
title = models.CharField(max_length=32 )
price = models.DecimalField(max_digits=5 , decimal_places=2 )
publish_date = models.DateField()
publisher = models.ForeignKey(to="Publisher" , on_delete=models.CASCADE)
authors = models.ManyToManyField(to="Author" )
def __str__ (self ) :
return self .title
ModelForm类:
from django import forms
from app01 import models
class BookModelForm (forms.ModelForm):
class Meta :
model = models.Book
fields = "__all__"
widgets = {
"publish_date" : forms.widgets.DateInput(
attrs={"type" : "date" }
)
}
labels = {
"title" : "书名" ,
"price" : "价格" ,
"publish_date" : '出版日期' ,
"publisher" : "出版社名称" ,
"authors" : "作者"
}
error_messages = {
"title" : {
"required" : "书名不能为空"
}
}
def __init__ (self, *args, **kwargs ):
super (BookModelForm, self).__init__(*args, **kwargs)
for field_name in iter (self.fields):
field = self.base_fields[field_name]
field.widget.attrs.update({
"class" : "form-control" ,
})
views 视图函数:
from django.shortcuts import render,redirect
from app01 import modelform
from app01 import models
def book_list (request ):
book_list = models.Book.objects.all ()
return render(request, 'book_list.html' , {'book_list' : book_list})
def add_book (request ):
if request.method == "POST" :
form_obj = modelform.BookModelForm(request.POST)
if form_obj.is_valid():
form_obj.save()
return redirect("/book_list/" )
modelform_obj = modelform.BookModelForm()
return render(request, 'add_book.html' , {"modelform_obj" : modelform_obj})
def edit_book (request,pk ):
book_obj = models.Book.objects.filter (id =pk).first()
if request.method == "POST" :
form_obj = modelform.BookModelForm(request.POST, instance=book_obj)
if form_obj.is_valid():
form_obj.save()
return redirect("/book_list/" )
form_obj = modelform.BookModelForm(instance=book_obj)
return render(request, "edit_book.html" , locals ())
book_list.html
<!DOCTYPE html >
<html lang ="en" >
<head >
<meta charset ="UTF-8" >
<title > 书籍列表</title >
<link href ="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css" rel ="stylesheet" >
</head >
<body >
<div class ="container" >
<div class ="row" >
<div class ="col-md-8 col-offset-2" >
<a href ="/add_book/" > 添加书籍</a >
<table border ="1" >
<thead >
<tr >
<th > 序号</th >
<th > id</th >
<th > 书名</th >
<th > 价格</th >
<th > 出版日期</th >
<th > 出版社</th >
<th > 作者</th >
<th > 操作</th >
</tr >
</thead >
{% for book in book_list %}
<tr >
<td > {{ forloop.counter }}</td >
<td > {{ book.id }}</td >
<td > {{ book.title }}</td >
<td > {{ book.price }}</td >
<td > {{ book.publish_date }}</td >
<td > {{ book.publisher }}</td >
<td > {{ book.authors.all }}</td >
<td >
<a href ="/edit_book/{{ book.id }}/" > 编辑</a >
</td >
</tr >
{% endfor %}
</table >
</div >
</div >
</div >
</body >
</html >
add_book.html
<!DOCTYPE html >
<html lang ="en" >
<head >
<meta charset ="UTF-8" >
<title > 添加书籍</title >
<link href ="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css" rel ="stylesheet" >
</head >
<body >
<div class ="container" >
<div class ="row" >
<div class ="col-md-6 col-offset-3" >
<form role ="form" action ="" method ="post" >
{% csrf_token %}
{% for modelform in modelform_obj %}
<p >
{{ modelform.label }}
{{ modelform }}
</p >
{% endfor %}
<button type ="submit" class ="btn btn-success" > 提交</button >
</form >
</div >
</div >
</div >
</body >
</html >
edit_book.html
<!DOCTYPE html >
<html lang ="en" >
<head >
<meta charset ="UTF-8" >
<title > 添加书籍</title >
<link href ="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css" rel ="stylesheet" >
</head >
<body >
<div class ="container" >
<div class ="row" >
<div class ="col-md-6 col-offset-3" >
<form role ="form" action ="" method ="post" >
{% csrf_token %}
{% for filed in form_obj %}
<p >
{{ filed.label }}
{{ filed }}
</p >
{% endfor %}
<button type ="submit" class ="btn btn-success" > 提交</button >
</form >
</div >
</div >
</div >
</body >
</html >
ModelForm增加了Form组件和对应数据库之间的联系,进而简化了Form类的代码
ModelForm继承了Form组件中的所有方法的同时,简化了前端获取数据和对应数据库之间的数据对接,不需要在对数据的内容做过多的操作。
批量添加样式:
通过重写ModelForm类的init方法来实现。
def __init__ (self , *args, **kwargs) :
super (BookModelForm, self ).__init__(*args, **kwargs)
for field in iter(self .fields):
self .fields[field].widget.attrs.update({
'class' : 'form-control'
})
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
· 用 C# 插值字符串处理器写一个 sscanf