Django模板继承与ModelForm实战指南

顾言
顾言
发布时间:2026-10-15| 4人浏览过
原创

本文详解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内容,请搜索本站以前的文章或继续浏览下面的相关文章。希望大家以后多多支持本站!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。