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>
相关推荐
憧憬成为web高手2 分钟前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学15 分钟前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh2 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
z123456789863 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD3 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
TlSfoward4 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记4 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘
LabVIEW开发5 小时前
NI Package Manager安装LabVIEW时InternalServerError错误
网络·数据库·labview·labview知识·labview功能·labview程序
SelectDB5 小时前
PostgreSQL 实时同步到 Apache Doris:一站式 CDC 解决方案
数据库
欲速不达88205 小时前
Mysql并发DML锁等待的优化
数据库·mysql