Django设计模式以及模板层

Django设计模式以及模板层

MVC和MTV

传统的MVC

作用:降低模块间的耦合度(解耦)

Django的MTV模式

作用:降低模块间的耦合度(解耦)


什么是模板

1、模板是可以根据字典数据动态变化的html网页

2、模板可以根据视图中传递的字典数据动态生成相应的HTML网页。

模板配置

创建模板文件夹<项目名>/templates

在setting.py中TEMPLATES配置项

1、BACKEND:指定模板的引擎

2、DIRS:模板的搜索目录(可以是一个或多个)

3、APP_DIRS:是否要在应用中的templates文件夹中搜索模板文件

4、OPTIONS:有关模板的选项

配置项中需要修改的部分

设置DIRS ——'DIRS': [os.path.join(BASE_DIR,'templates')],

模板的加载方式

方案1——通过loader获取模板,通过HttpResponse进行响应

在视图函数中

方案2——使用render()直接加载并响应模板

在视图函数中:

案例:

def test_html(request):
    from django.template import loader
    t = loader.get_template('test_html.html')
    html = t.render()
    return HttpResponse(html)
    #方案二直接加这两句即可
    from django.shortcuts import render
    return render(request,'test_html.html')

视图层与模板层之间的交互

1、视图函数中可以将Python变量封装到字典中传递到模板

2、模板中,我们可以用{{变量名}}的语法 调用试图传进来的变量

案例:

    from django.shortcuts import render
    dic = {'username':'gyq','age':18}
    return render(request,'test_html.html',dic)
#html页面

    

{{ username }}是模板层的~~~

模板的变量

能传递到模板中的数据类型

在模板中使用变量语法

模板标签

作用:将一些服务端的功能嵌入到模板中,例如流程控制等

标签语法

模板标签-if标签语法

案例:

#views
def test_if_for(request):
    dic = {}
    dic['x'] = 10    
    return render(request,'test_if_for.html',dic)
#HTML

    {% if x > 10 %}
    今天天气很好
    {% else %}
    今天天气非常好
    {% endif %}

模板标签-if标签-练习

模板标签 - for标签

语法:

内置变量 - forlop

#VIEWS
def test_if_for(request):
    dic = {}
    dic['x'] = 10
    dic['lst'] = ['Tom','Jack','Lily']
    return render(request,'test_if_for.html',dic)
#HTML  
  {% for name in lst %}
        {% if forloop.first %} &&&&&& {% endif %}
        

{{ forloop.counter }} {{ name }}

        {% if forloop.last %} ===== {% endif %}     {% empty %}         当前没数据     {% endfor %}

模板过滤器

定义:在变量输出时对变量的值进行处理

作用:可以通过使用过滤器来改变变量的输出显示

语法:{{变量|过滤器1:‘参数值1’|过滤器2:‘参数值2’...}}

常用过滤器

案例

int 是 {{ int|add:2}}

str 是 {{ str|upper }}

模板的继承

模板继承可以使父模板的内容重用,子模板直接继承父模板的全部内容并可以覆盖父模板中相应的块

语法 - 父模板中:

定义父模板中的块block标签(允许被子模板修改的部分)

标识出哪些在子模板中是允许被修改的

block标签:在父模板中定义,可以在子模板中覆盖

语法 - 子模板中

继承模板extends标签(写在模板文件的第一行)

例如{%extends 'base.html'%}

子模板 重写父模板中的内容块

{% block block_name %}

子模板用来覆盖父模板中 block_name 块的内容

{% endblock block_name %} #(结束符的block_name可以省略)

重写的覆盖规则

不重写,将按照父模板的效果显示

重写,则按照重写效果显示

注意

模板继承时,服务器端的动态内容无法继承

案例:

#父模板


    {% block mytitle %}
    主页
    {% endblock %}


    {{ lst }}
    音乐频道    #注意:此处定义的是路由url,不是html普通超链接
    体育频道    #注意:此处定义的是路由url,不是html普通超链接
    {% block info %}
        这是主页
    {% endblock %}
    

有任何问题联系XXXX

#子模板继承父类,重写

{% extends 'base.html' %}
{% block mytitle %}
    音乐频道
{% endblock %}
{% block info %}
    欢迎来到音乐频道
{% endblock %}

模板的继承

父模板 - 定义可被修改的block

子模板 - 继承父模板;按需修改父模板中定义的block

URL反向解析

代码中url书写规范

1、绝对地址

http://172.0.0.1:8000/page/1

2、相对地址

方式1


方式2

#HTML

    绝对地址
    带'/'的相对地址
    不带'/'的相对地址
#URL
  #http://192.168.40.135:8000/test/url
    path('test/url',views.test_url),
    path('test_url_result',views.test_url_result)

URL反向解析

url反向解析是指在视图或模板中,用path定义的名称来动态查找或计算出相应的路由

path函数的语法

path(route,views,name="别名")

path('page',views.page_view,name="page_url")

根据path中的'name='关键字传参给url确定了唯一确定的名字,在模板或试图中,可以通过这个名字反向推断出此url信息。

模板中 - 通过url标签实现地址的反向解析

案例

#url  
path('test_url_result/',views.test_url_result,name='tr')
#html
url反向解析版本
#views
def test_url_result(request, age):
    return HttpResponse('---test url res is ok')

在视图函数中 ->可调用django中的reverse方法进行反向解析

案例

#views
def test_url_result(request, age):
    #302跳转
    from django.urls import reverse
    url = reverse('base_index')
    return HttpResponseRedirect(url)
#url
path('base_index',views.base_view, name='base_index')

静态文件配置 - settings.py

1、配置静态文件的访问路径【该配置默认存在】

通过哪个url地址找静态文件

STATIC_URL = '/static/'

说明:

指定访问静态文件时是需要通过/static/xxx或

http://127.0.0.1:8000/static/xxx

[xxx表示具体的静态资源位置]

2、配置静态文件的存储路径STATICFILES_DIRS

STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),) #注意需要加逗号,因为这是一个元组

静态文件访问

方案1 - 直接拼接访问路径

#绝对路径

#相对路径

方案2—动态写法

通过{% static %}标签访问静态文件

1、加载static - {% load static %}

2、使用静态资源 - {% static '静态资源路径' %}

3、样例

#使用案例

{% load static %}

什么是应用

应用在Django项目中是一个独立的业务模块,可以包含自己的路由、视图、模板、模型

创建步骤

1、用manage.py中的子命令startapp 创建应用文件夹

python3 manage.py startapp 应用名

2、在settings.py的INSTALLED_APPS列表中配置安装此应用

分布式路由

Django中,主路由配置文件(urls.py)可以不处理用户具体路由,主路由配置文件的可以做请求的分发(分布式请求处理)。具体的请求可以由各自的应用来进行处理。

配置分布式路由

步骤1、主路由中调用include函数

语法:include('app名字.url模块名')

作用:用于将当前路由转到各个应用的路由配置文件的urlpatterns进行分布式处理

步骤2、应用下配置urls.py

应用下手动创建urls.py文件,内容结构同主路由完全一样

然后再应用下的views.py中定义函数验证

练习-配置分布式路由

1.创建两个应用

1.创建sport应用,并注册

2.创建news应用,并注册

2.创建分布式路由系统


应用下的模板

应用内部可以配置模板目录

指定访问某个应用页面

在应用模板下创建与应用同名文件夹,然后将需要访问的页面存放在

展开阅读全文

页面更新:2024-03-05

标签:模板   重写   分布式   视图   路由   变量   静态   语法   模式   标签   文件

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top