django模板继承和组件了解

1、模板继承

什么时候需要用到模板呢,比如我们在开发的页面的导航栏,你点不同的功能页面这个导航栏都是一样的,如果每个页面都要加上这个导航条会写重复代码,而且如果导航条有变化,每个页面都要修改,这个是很不方便的,所以我们可以使用模板,把公共的提取出来放到一个模板文件中,其它页面来继承。

比如下面的模板文件为layout.html

比如要引入公共的插件,在模板文件中引入

{% block XXX %}{% endblock%} 这个是占位符,在模板中留有的占位符,在继承的页面就可以重新写的,这个模板留了三处可以实现根模板不同的东西

html 复制代码
{% 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/css/bootstrap.css' %}">
     {% block css %}{% endblock%}
</head>
<body>
<h1>标题</h1>
<div>
    {% block content %}{% endblock%}
</div>
<h1>底部</h1>
<script src="{% static 'js/jquery-3.7.0.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-3.4.1/js/bootstrap.js' %}"></script>
 {% block js %}{% endblock%}
</body>
</html>

继承模板department.html 页:

{% extends 'layout.html' %} 这个是引入模板

在占位符中间写当前页面特有的东西

html 复制代码
<!--引入模板-->
{% extends 'layout.html' %}

{% block css %}
     <link rel="stylesheet" href="{% static 'plugins/XXXXXX.css' %}">
{% endblock %}

{% block content %}
    <h1>部门管理页面</h1>
{% endblock %}

{% block js %}
    <script src="{% static 'js/XXXX.js' %}"></script>
{% endblock %}

2、Django组件

有两种组件

  • Form组件
  • ModelFrom

ModelFrom组件比Form更好用。

组件常用在对数据库的操作,比如从数据库表中读取了很多字段,要在页面展示,如果不用组件,我们在页面要每一个标签去写,这样是很繁琐的,所以django提供了组件,大大减少代码量

Form组件

比如在models.py中定义了UserInfo的表,里面有name 和pwd 和age字段

python 复制代码
from django.db import models

# Create your models here.


class UserInfo(models.Model):
    name = models.CharField(verbose_name="姓名",max_length=16)
    pwd = models.CharField(verbose_name="密码", max_length=64)
    age = models.IntegerField(verbose_name="年龄")


class Department(models.Model):
    """部门表"""
    title = models.CharField(verbose_name="标题",max_length=32)

urls.py

python 复制代码
from django.urls import path
from app01 import views

urlpatterns = [
    #path('admin/', admin.site.urls),
    path('add/user/', views.add_user),
]

在views.py 中实现添加用户的方法。

需要先定义一个类,并继承forms ,在这个类里面,指定每个字段是什么类型的标签,比如下面代码指定的input 标签,有多少字段这里就写多少个

在user_add 中把这个类的实例化对象传到user_add.html页面。

python 复制代码
from django.shortcuts import render,redirect
from django import forms
import models

# Create your views here.

class MyForm(forms):
    name = forms.CharField(widget=forms.TextInput)
    pwd = forms.CharField(widget=forms.TextInput)
    

def user_add(request):
    if request.method == 'GET':
        form = MyForm()
        return render(request,'user_add.html',{"form":form})

user_add.html 中通过for 循环获取form中的值,这样就可以循环创建标签了,不用一个一个去写了

html 复制代码
<form method="post">
    {% for field in form %}
        {{ field }}
    {% endfor %}
    
</form>

ModelFrom(操作数据库推荐)

1、models.py 的文件定义数据库跟上面的一样

python 复制代码
from django.db import models

# Create your models here.


class UserInfo(models.Model):
    name = models.CharField(verbose_name="姓名",max_length=16)
    pwd = models.CharField(verbose_name="密码", max_length=64)
    age = models.IntegerField(verbose_name="年龄")


class Department(models.Model):
    """部门表"""
    title = models.CharField(verbose_name="标题",max_length=32)

urls.py

python 复制代码
from django.urls import path
from app01 import views

urlpatterns = [
    #path('admin/', admin.site.urls),
    path('add/user/', views.add_user),
]

views.py 先定义一个类,继承forms.ModelForm, 在写个内部类Meta ,models.UserInfo通过这个将models中定义数据库的字段拿过来,在fields这个列表中写需要的字段,把这个传给页面

python 复制代码
from django.shortcuts import render
from django import forms
import models

# Create your views here.

class UserModelForm(forms.ModelForm):

    class Meta:
        model = models.UserInfo
        fields = ['name','pwd','age']

    def __init__(self, *args,**kwargs):
        super().__init__(*args,**kwargs)

        #循环找到所有的插件,添加了class="form-control"
        for name,field in self.fields.items():
            field.widget.attrs = {"class": "form-control"}

def add_user(request):
    form = UserModelForm()

    return render(request,'user_add.html',{"form":form})

user_add.html 中通过循环来获取form中的数据,并创建标签。field.label是获取到models中的verbose_name这个的值。

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form>
        {{% csrf_token %}}

        {% for field in form %}
             {{ field.label }}:{{ field }}
        {% endfor %}

    </form>

</body>
</html>
相关推荐
burning_maple7 分钟前
redis笔记
数据库·redis·笔记
oh LAN14 分钟前
提升性能:数据库与 Druid 连接池优化指南
数据库·mysql
砚边数影18 分钟前
AI数学基础(一):线性代数核心,向量/矩阵运算的Java实现
java·数据库·人工智能·线性代数·矩阵·ai编程·金仓数据库
虹科网络安全19 分钟前
艾体宝新闻 | Redis 月度更新速览:2025 年 12 月
数据库·redis·缓存
Linux-palpitate21 分钟前
PostgreSQL单机部署
数据库·postgresql
engchina26 分钟前
自然语言转 SQL 并不是“魔法”
数据库·人工智能·sql·text2sql·nl2sql·自然语言转sql
小陈phd2 小时前
langGraph从入门到精通(六)——基于 LangGraph 实现结构化输出与智能 Router 路由代理
android·网络·数据库
安当加密2 小时前
电力系统如何防“明文传输”?某电网公司用SM2+UKey构建“端到端加密”实战
服务器·数据库·安全·阿里云
BD_Marathon2 小时前
动态SQL(六)foreach标签2
数据库·sql
小豪GO!2 小时前
数据库-八股
数据库