当前位置: 首页 > news >正文

django模板继承和组件了解

1、模板继承

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

比如下面的模板文件为layout.html
比如要引入公共的插件,在模板文件中引入
{% block XXX %}{% endblock%} 这个是占位符,在模板中留有的占位符,在继承的页面就可以重新写的,这个模板留了三处可以实现根模板不同的东西

{% 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’ %} 这个是引入模板

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

<!--引入模板-->
{% 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字段

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

from django.urls import path
from app01 import viewsurlpatterns = [#path('admin/', admin.site.urls),path('add/user/', views.add_user),
]

在views.py 中实现添加用户的方法。
需要先定义一个类,并继承forms ,在这个类里面,指定每个字段是什么类型的标签,比如下面代码指定的input 标签,有多少字段这里就写多少个
在user_add 中把这个类的实例化对象传到user_add.html页面。

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中的值,这样就可以循环创建标签了,不用一个一个去写了

<form method="post">{% for field in form %}{{ field }}{% endfor %}</form>

ModelFrom(操作数据库推荐)

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

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

from django.urls import path
from app01 import viewsurlpatterns = [#path('admin/', admin.site.urls),path('add/user/', views.add_user),
]

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

from django.shortcuts import render
from django import forms
import models# Create your views here.class UserModelForm(forms.ModelForm):class Meta:model = models.UserInfofields = ['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这个的值。

<!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>
http://www.lryc.cn/news/98641.html

相关文章:

  • 首屏优化,给以图片为背景的元素增加相似背景,优化用户体验,background-image 绘制规则
  • 【用户体验分析报告】 按需加载组件,导致组件渲染卡顿,影响交互体验?组件拆包预加载方案来了!
  • idea 关闭页面右侧预览框/预览条
  • CSS3 Flexbox
  • 东南大学轴承故障诊断(Python代码,CNN模型,适合复合故障诊断研究)
  • ubuntu--Motrix
  • PHP 3des加解密新旧方法可对接加密
  • 【朴素贝叶斯-新闻主题分类】
  • 安卓面试问题记录
  • php-golang-jsonrpc2.0 rpc-codec/jsonrpc2和tivoka/tivoka实践
  • 听力词汇笔记(6级)
  • 【JVM】详细解析java创建对象的具体流程
  • kafka怎么用代码读取数据
  • 网关与路由器的区别
  • 助力工业物联网,工业大数据之工单事实指标需求分析【二十】
  • python_PyQt5开发工具结构基础
  • 【C++】入门基础2
  • Reinforcement Learning with Code 【Chapter 8. Value Funtion Approximation】
  • 常用InnoDB参数介绍
  • 云原生网关部署新范式丨 Higress 发布 1.1 版本,支持脱离 K8s 部署
  • 【通讯录】--C语言
  • 通过两种实现方式理解CANoe TC8 demo是如何判断接收的以太网报文里的字段的
  • Mysql- 存储引擎
  • vite / nuxt3 项目使用define配置/自定义,可以使用process.env.xxx获取的环境变量
  • 在Linux、Ubuntu中跨平台编译ARM(AARCH64)平台的binutils
  • SpringCloudAlibaba微服务实战系列(五)Sentinel1.8.5+Nacos持久化
  • pytest中conftest的用法以及钩子基本使用
  • 数据结构---顺序栈、链栈
  • 我的MacBook Pro:维护心得与实用技巧
  • Higress非K8S安装