Python 【第十一章】 Django模版

时间:2023-03-08 21:42:23

1、直接传值

urls.py

"""mysite URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.10/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url
from django.contrib import admin
from cmdb import views
from django.conf.urls import url, include urlpatterns = [
# url(r'^web/', include('cmdb.urls')),
url(r'^template/',views.template),
]

views.py

def template(request):
return render(request,'template.html',
{'k1':'v1',
'k2':[11,22,33,44,55],
'k3':{'nid':12,'name':'alex'}})
template.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
{{ k1 }}
{{ k2.0 }}
{{ k3.nid }} </body>
</html>

备注:例如以上单值传递时 索引 要使用 点 再加 一个索引值来取值。

上面列表通过for循环来取值

template.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
{{ k1 }}
{{ k2.0 }}
{{ k3.nid }} {% for item in k2 %}
<p>{{ item }}</p>
{% endfor %}
</body>
</html>

Python 【第十一章】 Django模版

一些例子

重复输出item内容

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
{{ k1 }}
{{ k2.0 }}
{{ k3.nid }} {% for item in k2 %}
<p>{{ item }},{{ item }}</p>
{% endfor %}
</body>
</html>

Python 【第十一章】 Django模版

输出循环序号

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
{{ k1 }}
{{ k2.0 }}
{{ k3.nid }} {% for item in k2 %}
<p>{{ item }},{{ forloop.counter }}</p>
{% endfor %}
</body>
</html>

Python 【第十一章】 Django模版

循环序号从0开始

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
{{ k1 }}
{{ k2.0 }}
{{ k3.nid }} {% for item in k2 %}
<p>{{ item }},{{ forloop.counter }} {{ forloop.counter0 }}</p>
{% endfor %}
</body>
</html>

Python 【第十一章】 Django模版

循环取第一个,或最后一个

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
{{ k1 }}
{{ k2.0 }}
{{ k3.nid }} {% for item in k2 %}
<p>{{ item }},{{ forloop.counter }}, {{ forloop.counter0 }},{{ forloop.first }},{{ forloop.last }}</p>
{% endfor %}
</body>
</html>

Python 【第十一章】 Django模版

2、判断语句在模版中

{% if 1 == 1  %}
<h1>123</h1>
{% endif %}
{% if k1 == 'v1'  %}
<h1>V1</h1>
{% elif k2 == 'v2' %}
<h1>V2</h1>
{% else %}
<h1>777</h1>
{% endif %}

模版语言内置方法(Django自带函数)

{{ item.event_start|date:"Y-m-d H:i:s"}}   #时间格式
{{ bio|truncatewords:"30" }}          #显示前30个字符
{{ my_list|first|upper }}          #字符串第一个字符大写
{{ name|lower }}                #字符串变小字

模版语言自定义方法

  filter

  simple_tag

Python 【第十一章】 Django模版

        1、创建指定文件,名称不能改 templatetags
2、创建任意 .py 文件,如:xx.py from django import template
from django.utils.safestring import mark_safe
       #下面一句 在3.5.2要屏蔽,否则不能正常运行自定义方法#
#from django.template.base import resolve_variable, Node, TemplateSyntaxError
# 必须不变
register = template.Library() # 创建函数
@register.filter
def f1(value):
return value + "666"
3、在html模版的头部执行 {% load xx %} 4、
k1 = 'VVV'
{{k1}} => vvv         #在html中生成 对应值
{{k1|f1}} => vvv666 5、 settings.py 中注册app 总结:
filter
限制:传参
支持:模版语言的 if 条件
simple_tag
不支持:模版语言的 if 条件

备注:

filter 只能传递一个参数。

例如

xx.py

#!/usr/bin/env python
#coding:utf-8
from django import template
from django.utils.safestring import mark_safe
# from django.template.base import resolve_variable, Node, TemplateSyntaxError register = template.Library() @register.filter
def f1(value,arg):
return value + ''+arg
html模版文件中
{% load xx %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body> #传入alex参数
{{ k1 | f1:'alex' }} </body>
</html>
 Python 【第十一章】 Django模版

simple_tag用法

xx.py

装饰器修改为

simple_tag
@register.simple_tag
def f2(value,arg):
return value + ''+arg

html模版中可以传入多个参数

{% load xx %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body> {% f2 '1' '2' %} </body>
</html>

Python 【第十一章】 Django模版

fitler  可以使用if条件判断

在html模版中

注意k1与f3之间管道不要有空格

{% if k1|f3 %}
<h1>True</h1>
{% else %}
<h1>False</h1>
{% endif %}

xx.py

@register.filter
def f3(value):
if value=="VVV":
return True
return False

Python 【第十一章】 Django模版

母版:

母版html文件:loyout.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" href="..." />
<style>
.pg-header{
height: 48px;
background-color: cadetblue;
}
.pg-body{
min-height: 500px;
}
.pg-body .body-menu{
width: 20%;
float: left;
}
.pg-body .body-content{
width: 80%;
float: left;
}
.pg-footer{
height: 100px;
background-color: brown;
}
.active{
background-color: aquamarine;
color: white;
}
</style> {% block css %}{% endblock %}
</head>
<body>
<div class="pg-header">
后台系统V1
</div>
<div class="pg-body">
<div class="body-menu">
<ul>
<li><a id="userinfo" href="/web/userinfo">用户管理</a></li>
<li><a id="assets" href="/web/assets">资产管理</a></li>
</ul>
</div>
<div class="body-content"> {% block body %}{% endblock %}
</div> </div>
<div class="pg-footer"></div>
<script src="xxx"></script>
{% block js %}{% endblock %}
</body>
</html>

导入母版html文件

{% extends 'layout.html' %}

{% block css %}
<style></style>
{% endblock %} {% block body %}
<ul>
{% for item in user_list %}
<li>{{ item.username }},{{ item.salary }}</li>
{% endfor %}
</ul> {% endblock %} {% block js %}
<script>
document.getElementById('userinfo').className = 'active';
</script>
{% endblock %}

备注:做母版中重要以下几部分

{% block css %}{% endblock %}  #允许子版自己定义css

{% block body %}{% endblock %}   #子版实际内容

{% block js %}{% endblock %}    #允许子版 自己定义js

在子版中 以下格式导入母版

{% extends 'layout.html' %}

{% block css %}
#子版自己定义CSS
{% endblock %} {% block body %}
# 子版内容
{% endblock %} {% block js %}
#子版自己定义js
{% endblock %}