赞
踩
目录
1. 在项目的settings.py配置文件中配置模板目录
'DIRS': [os.path.join(BASE_DIR,'templates')],
2. 在应用的视图文件加载模板,并放置要输出的数据
return render(request,“目录/模板文件.html”,{放置字典数据})
3. 在模板文件中使用变量、标签和过滤器等输出信息
{{ 变量 }} {% 标签 %} {{ 变量|过滤器 }}
模板引擎使用该TEMPLATES设置进行配置。这是一个配置列表,每个引擎一个。
默认值为空。在 settings.py由所产生的startproject命令定义一个更有用的值:
在做下面模板配置的同时,也要在项目的根目录下创建一个
templates
目录
- # 项目目录下的settings.py配置文件添加TEMPLATES中的DIRS配置
- TEMPLATES = [
- {
- 'BACKEND': 'django.template.backends.django.DjangoTemplates',
- 'DIRS': [os.path.join(BASE_DIR,'templates')],
- 'APP_DIRS': True,
- 'OPTIONS': {
- 'context_processors': [
- 'django.template.context_processors.debug',
- 'django.template.context_processors.request',
- 'django.contrib.auth.context_processors.auth',
- 'django.contrib.messages.context_processors.messages',
- ],
- },
- },
- ]
- {{ var }}
{% tag %}
for标签
- {% for ... in ... %}
- 循环逻辑
-
- {% endfor %}
if标签
- {% if ... %}
- 逻辑1
- {% elif ... %}
- 逻辑2
- {% else %}
- 逻辑3
- {% endif %}
例:
{% if vo.state == 0 %}
管理员
{% elif vo.state == 1 %}
VIP账户
{% else %}
<span style="color:red">禁用账户</span>
{% endif %}
comment标签
- {% comment %}
- 多行注释
- {% endcomment %}
include:加载模板并以标签内的参数渲染
{% include "base/index.html" %}
url:反向解析
{% url 'name' p1 p2 %}
csrf_token:这个标签用于跨站请求伪造保护
{% csrf_token %}
- {{ 变量|过滤器 }},例如{{ name|lower }},表示将变量name的值变为小写输出
- {{ data|safe }}
if list1|length > 1
name|lower|upper
list|join:", "
value|default:"什么也没有"
date:根据给定格式对一个date变量格式化
value|date:'Y-m-d'
官方文档内置过滤器参考:
{# 注释 #}
- {% comment %}
- 多行注释
- {% endcomment %}
这个注释是在网页上源代码里也看不到的
- {{ value|add:10 }}
- note:value=5,则结果返回15
- {{ value|add:-10 }}
- note:value=5,则结果返回-5,加一个负数就是减法了
- {% widthratio 5 1 100 %}
- note:等同于:(5 / 1) * 100 ,结果返回500,
- withratio需要三个参数,它会使用参数1/参数2*参数3的方式进行运算,进行乘法运算,使「参数2」=1
- {% widthratio 5 100 1 %}
- note:等同于:(5 / 100) * 1,则结果返回0.05,和乘法一样,使「参数3」= 1就是除法了。
templatetags
模板标签目录,建议内放一个__init__.py
的空文件templatetags
目录下创建一个模板标签文件pagetag.py(这个名字随意取)
,具体代码如下:- templatetags
- ├── pagetag.py
- ----------------pagetag.py-------------------------
- from django import template
-
- register = template.Library()
-
- # 自定义过滤器(实现大写转换)
- @register.filter
- def myupper(val):
- # print ('val from template:',val)
- return val.upper()
-
- # 自定义标签(实现减法计算)
- #from django.utils.html import format_html
- @register.simple_tag
- def jian(a,b):
- res = int(a) - int(b)
- return res
{% load pagetag %}
- <h4>6. 自定义标签 </h4>
- {% load pagetag %}
- 大写:{{name|myupper}} <br/>
- 相减:{% jian m1 m2 %}
- { % block block_name % }
- 这里可以定义默认值
- 如果不定义默认值,则表示空字符串
- { % endblock % }
{ % extends "base.html" % }
- { % block block_name % }
- 实际填充内容
- { % endblock % }
说明
- { % block block_name % }
- 区域内容
- { % endblock block_name % }
1.创建根级模板
- <!DOCTYPE html>
- <html>
- <head>
- <title>{ % block title % }{ % endblock % } 水果超市</title>
- </head>
- <body>
- top--{{logo}}
- <hr/>
- { % block left % }
-
- { % endblock % }
-
- { % block content % }
-
- { % endblock % }
- <hr/>
- bottom
- </body>
- </html>
2.创建分支模版
- { % extends 'temtest/base.html' % }
-
- { % block title % }商品{ % endblock % }
-
- { % block left % }
- <h1>goods left</h1>
- { % endblock % }
- { % extends 'temtest/base.html' % }
-
- { % block title % }用户中心{ % endblock % }
-
- { % block left % }
- <font color='blue'>user left</font>
- { % endblock % }
- { % extends 'temtest/base.html' % }
-
- { % block content % }
- 首页内容
- { % endblock content % }
3.为具体页面创建模板,继承自分支模板
- { % extends 'temtest/base_goods.html' % }
- { % block content % }
- 商品正文列表
- { % endblock content % }
- { % extends 'temtest/base_user.html' % }
- { % block content % }
- 用户密码修改
- { % endblock content % }
4.视图调用具体页面,并传递模板中需要的数据
- logo='welcome to itcast'
- def index(request):
- return render(request, 'temtest/index.html', {'logo': logo})
- def goodslist(request):
- return render(request, 'temtest/goodslist.html', {'logo': logo})
- def userpwd(request):
- return render(request, 'temtest/userpwd.html', {'logo': logo})
5.配置url
- from django.urls import path
- from . import views
- urlpatterns = [
- path('', views.index, name='index'),
- path('list/', views.goodslist, name='list'),
- path('pwd/', views.userpwd, name='pwd'),
- ]
1.1 创建项目tpdemo,创建应用myapp
- # 创建项目框架tpdemo
- $ django-admin startproject tpdemo
-
- $ cd tpdemo
-
- # 在项目中创建一个myapp应用
- $ python manage.py startapp myapp
-
- # 创建模板目录
- $ mkdir templates
- $ mkdir templates/myapp
-
- $ cd ..
-
- $ tree tpdemo
-
- tpdemo
- ├── tpdemo
- │ ├── __init__.py
- │ ├── settings.py
- │ ├── urls.py
- │ └── wsgi.py
- ├── manage.py
- ├── myapp
- │ ├── admin.py
- │ ├── apps.py
- │ ├── __init__.py
- │ ├── models.py
- │ ├── tests.py
- │ └── views.py
- └── templates
- └── mytest
- ...
- #配置自己的服务器IP地址
- ALLOWED_HOSTS = ['*']
-
- ...
- #添加自己应用
- INSTALLED_APPS = [
- 'django.contrib.admin',
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.messages',
- 'django.contrib.staticfiles',
- 'myapp',
- ]
- ...
-
- # 配置模板路径信息
- TEMPLATES = [
- {
- 'BACKEND': 'django.template.backends.django.DjangoTemplates',
- 'DIRS': [os.path.join(BASE_DIR,'templates')],
- 'APP_DIRS': True,
- 'OPTIONS': {
- 'context_processors': [
- 'django.template.context_processors.debug',
- 'django.template.context_processors.request',
- 'django.contrib.auth.context_processors.auth',
- 'django.contrib.messages.context_processors.messages',
- ],
- },
- },
- ]
-
-
- ...
- # 数据库连接配置
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.mysql',
- 'NAME': 'mytest',
- 'USER': 'root',
- 'PASSWORD': '',
- 'HOST': 'localhost',
- 'PORT': '3306',
- }
- ...
pip install mysqlclient
-
- from django.urls import include,path
- from django.contrib import admin
-
- urlpatterns = [
- path('admin/', admin.site.urls),
- path('', include('myapp.urls')),
- ]
1.5 配置当前应用myapp的路由配置
在myapp应用目录下创建一个路由文件urls.py文件,注意此文件编码为utf-8(建议复制一个)。
编辑应用中的路由配置文件:tpdemo/myapp/urls.py, 内容如下:
-
- from django.urls import path
-
- from . import views
-
- urlpatterns = [
- path('', views.index, name="index"),
- ]
- from django.shortcuts import render
- from django.http import HttpResponse
-
- # 网站首页
- def index(request):
- return render(request,'myapp/index.html')
- <!DOCTYPE html>
- <html lang="cn">
- <head>
- <meta charset="UTF-8">
- <title>Django框架案例</title>
- </head>
- <body>
- <h2>Django框架案例</h2>
-
- <h4><a href="#">1. Ajax实战笔记--城市级联操作</a></h4>
- </body>
- </html>
- [root@localhost tpdemo]# ls
- tpdemo manage.py myapp templates
-
- [root@localhost tpdemo]# python manage.py runserver 0.0.0.0:8000
2.1 将提前准备好的district.sql信息导入到mydb数据库中
在mydb数据库中存在一个district(城市区县信息表)
2.2 编写model类:打开tpdemo/myapp/models.py文件
- from django.db import models
-
- # 自定义城市区县信息model类
- class District(models.Model):
- name = models.CharField(max_length=255)
- upid = models.IntegerField()
-
- class Meta:
- db_table = "district" # 指定真实表名
- ...
- # 城市级联操作
- path('showdistrict/', views.showdistrict, name='showdistrict'), #加载网页
- path('district/<int:upid>', views.district, name='district'), #Ajax加载城市信息
- ...
- from django.http import HttpResponse,JsonResponse
-
- from myapp.models import District
-
- ...
- # 加载城市级联信息操作模板
- def showdistrict(request):
- return render(request,"myapp/district.html")
-
- # 加载对应的城市信息,并json格式ajax方式响应
- def district(request,upid):
- dlist = District.objects.filter(upid=upid)
- list = []
- for ob in dlist:
- list.append({'id':ob.id,'name':ob.name})
- return JsonResponse({'data':list})
- ...
启动服务测试:url:http://localhost:8000/district/0 加载一级城市信息
2.5 开发网页前端的准备:首先启用静态资源目录
- ...
- STATIC_URL = '/static/'
-
- STATICFILES_DIRS = [
- os.path.join(BASE_DIR,'static'),
- ]
- ...
- <h4><a href="{% url 'showdistrict' %}">1. Ajax实战笔记--城市级联操作</a></h4>
- ...
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Ajax实战--城市级联操作</title>
- <script type="text/javascript" src="/static/js/jquery-1.8.2.min.js"></script>
- <script type="text/javascript">
- //编写js代码
- $(function(){
- $.ajax({
- type:'get',
- url:"{% url 'district' 0 %}",
- dataType:'json',
- async: false,
- success:function(res){
- list = res.data;
- //遍历响应的城市信息
- for(var i=0;i<list.length;i++){
- $("#cid").append("<option value='"+list[i].id+"'>"+list[i].name+"</option>");
- }
- },
- });
-
- //获取最后一个下拉框并添加选中事件
- $("select").live('change',function(){
- //获取选中的id号
- var id = $(this).val();
- $(this).nextAll().remove();
- $.ajax({
- url: "/district/"+id,
- type: 'get',
- data: {},
- dataType:'json',
- success:function(res){
- if(res.data.length<1)
- return;
- var data = res.data;
- var select = $("<select></select>")
- for(var i=0;i<data.length;i++){
- $('<option value="'+data[i].id+'">'+data[i].name+'</option>').appendTo(select)
- //$('select:last').append('<option value="'+data[i].id+'">'+data[i].name+'</option>');
- }
- $("select:last").after(select);
- }
- });
- });
-
- })
-
- </script>
- </head>
- <body>
- <h2>Ajax实战笔记--城市级联操作</h2>
-
- <select id="cid">
- <option>-请选择-</option>
- </select>
- </body>
- </html>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。