Django ModelForm 组件详解及最佳实践

在Django开发中,ModelForm是一种强大的工具,能够轻松地将数据库模型与表单结合,极大简化了数据验证与存储操作。通过以下实例,我们将深入了解ModelForm的创建、使用以及在编辑数据时的优雅应用。

图片[1]-Django ModelForm 组件详解及最佳实践-山海云端论坛


# 首先导入ModelForm 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": "用户名" } # views.py def student(request): if request.method == 'GET': student_list = StudentList() return render(request, 'student.html', {'student_list': student_list}) else: student_list = StudentList(request.POST) if student_list.is_valid(): student_list.save() return redirect(request, 'student_list.html', {'student_list': student_list}) # 编辑数据 # 如果不用ModelForm,编辑的时候得显示之前的数据吧,还得挨个取一遍值, # 如果ModelForm,只需要加一个instance=obj(obj是要修改的数据库的一条数据的对象)就可以得到同样的效果 # 保存的时候要注意,一定要注意有这个对象(instance=obj),否则不知道更新哪一个数据 def student_edit(request, pk): obj = Student.objects.filter(pk=pk).first() if not obj: return redirect('test') if request.method == "GET": student_list = StudentList(instance=obj) return render(request, 'student_edit.html', {'student_list': student_list}) else: student_list = StudentList(request.POST, instance=obj) if student_list.is_valid(): student_list.save() return render(request, 'student_edit.html', {'student_list': student_list})

总结:从上边可以看到ModelForm用起来是非常方便的,比如增加修改之类的操作。但是也带来额外不好的地方,model和form之间耦合了。如果不耦合的话,mf.save()方法也无法直接提交保存。但是耦合的话使用场景通常局限用于小程序,写大程序就最好不用了。

Django使用插件modelForm表单操作数据库

和方法二的使用表单Form相比,modelForm具有Form中所有的验证钩子,使用django的modelForm表单不需要重新定义Form,比较方便。

缺点是和数据库model耦合性太强;

# Model class Article(models.Model): title = models.CharField(max_length=20, unique=True) author = models.ForeignKey('Author') # ModelForm class ArticleForm(forms.ModelForm): class Meta: model = Article # 对应的model fields = "__all__" # 或('name','email','user_type') #验证哪些字段,"__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 } # labels,自定义在前端显示的名字 labels = { "name": "用户名" } # View文件如下: def test(request): if request.method == 'GET': obj = ArticleForm() return render(request, 'test.html', {'obj': obj}) else: form = ArticleForm(request.POST) if obj.is_valid(): # 验证合格,前端的数据保存在到数据库 form.save() # 默认save(commit=True),默认保存多对多,当commit=False时可以拆分保存操作 return HttpResponse('提交成功')

HTML文件如下:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/test/" method="post" novalidate> {% csrf_token %} <p>输入1{{ obj.inp1 }} {{ obj.errors.inp1.0 }}</p> <p>输入2{{ obj.inp2 }} {{ obj.errors.inp2.0 }}</p> <p>输入3{{ obj.inp3 }} {{ obj.errors.inp3.0 }}</p> <input type="submit" value="提交"> </form> </body> </html>

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容