Django模板继承与ModelForm实战指南
本文详解Django中模板继承与ModelForm的核心用法。通过{% block %}实现HTML复用,利用ModelForm自动绑定模型字段、生成表单HTML、执行数据校验并直接保存至数据库,解决手动处理表单繁琐及缺乏错误提示的问题。
模板的继承
在编写HTML文件时,常发现多个页面包含大量相同代码,例如静态插件的引入及基础CSS样式。为避免重复,可引入模板机制以简化操作。
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1-dist/css/bootstrap.css' %}" rel="external nofollow" >
</head>
<body>
<nav class="navbar navbar-default">...</nav>
<div>
{% block content %}{% endblock %}
</div>
<script src="{% static 'js/jquery-3.5.1.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>
</body>
</html>具体做法是在基础模板文件中定义占位符,如使用{% block content %}和{% endblock %}语法。其他相似HTML页面只需继承该模板,并在对应区块内编写特定内容(如div中的内容)即可。
{% extends "layout.html" %}
{% block content %}
<div class="container">
...
</div>
{% endblock %}form和ModelForm
在常规操作中,若需在列表页添加数据并连接数据库获取,通常需根据表单中name属性提取数据。例如,若已创建相关数据模型,需手动处理这些字段。
class UserInfo(models.Model):
''''员工表'''
name = models.CharField(verbose_name="姓名",max_length=32)
age = models.IntegerField(verbose_name="年龄")
password = models.CharField(verbose_name="密码",max_length=64)
account = models.DecimalField(verbose_name="账户余额",max_digits=10,decimal_places=2,default=0)
creat_time = models.DateTimeField(verbose_name="入职时间")提取数据后,需手动将其添加到数据库中。
user = request.POST.get("user")
pwg = request.POST.get("pwd")
account = request.POST.get("ac")
ctime = request.POST.get("ctime")
# get中的内容是用户输入表单中的name的属性值,可以自己定义
models.UserInfo.object.creat(name=user,password=pwd ......)这种方式不仅繁琐,还存在以下问题:
用户提交的数据缺乏校验机制。
页面未显示具体的错误提示信息。
页面上每个字段均需手动编写HTML代码。
关联数据需手动获取并在页面中展示。
为解决上述问题,可利用Django内置的两个组件:Form和ModelForm。
使用方法
在视图(view)中处理逻辑。
from django import forms
class UserAdd(forms.ModelForm): #创建一个类,类中继承forms
name = forms.CharField(min_length=3)
#这里可以创建各类表单,也写一些约束条件,让html页面显示约束条件,因为我在我的django中已经在models中创建好了数据表,所有我在这里不再创建,在下面直接拿到我的数据表
title = forms.CharField(max_length=100, label='标题')
content = forms.CharField(widget=forms.Textarea, label='内容')
email = forms.EmailField(label='邮箱')
reply = forms.BooleanField(required=False, label='回复')
#拿到数据表
class Meta:
model = models.UserInfo
fields = ["name","password","age","creat_time","gender","depart"]
def user_add(request):
'''添加用户'''
if request.method == "GET":
form = UserAdd()
return render(request,"user_add.html",{'form': form})在HTML中利用for循环即可自动生成表单结构。
<form method="post" novalidate>
{% csrf_token %}
{% for field in form %}
<div class="form-group">
<label>{{ field.label }}</label>
{{ field }}
</div>
{% endfor %}同时,可以为生成的表单添加各类样式。
widgets = {
"name" : forms.TextInput(attrs={"class":"form-control"}),
}
#这样写可能会有点繁琐,得多次定义,我们可以用类和面向对象来写
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
for name,field in self.fields.items():
#也可以加上判断条件
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
for name,field in self.fields.items():
if name == "password":
continue
field.widget.attrs = {"class": "form-control"}此外,还能在表单中添加各种判断逻辑。
def user_add(request):
'''添加用户'''
if request.method == "GET":
form = UserAdd()
return render(request,"user_add.html",{'form': form})
form = UserAdd(data=request.POST)
#如果条件成立则添加到数据库中
if form.is_valid():
form.save()
return redirect('/user/list/')
else:
return render(request,"user_add.html",{'form': form})通过调用form.save(),即可将所有写入的数据直接添加到数据库中。
HTML页面中可显示各类错误信息,并配合条件判断(如使用span标签)进行展示。
{% for field in form %}
<div class="form-group">
<label>{{ field.label }}</label>
{{ field }}
<span style="color:red">{{ field.errors.0 }}</span>
</div>
{% endfor %}查看输出结果,若数据满足条件则存入数据库;若不满足,则显示相应错误。

还可在设置文件中修改提示语言。

总结
至此,关于Django中模板继承与ModelForm的介绍完毕。更多相关Django模板继承与ModelForm内容,请搜索本站以前的文章或继续浏览下面的相关文章。希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













