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页面
<body>
    <h3>{{ username }}是模板层的~~~</h3>
</body>

模板的变量

能传递到模板中的数据类型
在模板中使用变量语法

模板标签

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

标签语法

模板标签-if标签语法

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

#HTML
<body>
    {% if x > 10 %}
    今天天气很好
    {% else %}
    今天天气非常好
    {% endif %}
</body>

模板标签-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 %}
        <p> {{ forloop.counter }} {{ name }}</p>
        {% if forloop.last %} ===== {% endif %}
    {% empty %}
        当前没数据
    {% endfor %}

模板过滤器

定义:在变量输出时对变量的值进行处理
作用:可以通过使用过滤器来改变变量的输出显示
语法: {{变量|过滤器1:‘参数值1’|过滤器2:‘参数值2’...}}

常用过滤器

案例
<!--过滤器演示  -->
<h3>int 是 {{ int|add:2}}</h3>  
<h3>str 是 {{ str|upper }}</h3>

模板的继承

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

语法 - 父模板中:

    定义父模板中的块 block标签(允许被子模板修改的部分)
    标识出哪些在子模板中是允许被修改的
    block标签:在父模板中定义,可以在子模板中覆盖

语法 - 子模板中

 
  继承模板extends标签(写在模板文件的第一行)
    例如{%extends 'base.html'%}
    子模板 重写父模板中的内容块
   {% block block_name %}
   子模板用来覆盖父模板中 block_name 块的内容
   {% endblock block_name %}    #(结束符的block_name可以省略)
重写的覆盖规则   
不重写,将按照父模板的效果显示
重写,则按照重写效果显示
注意
模板继承时,服务器端的动态内容无法继承
案例:
#父模板
<meta charset="UTF-8">
    {% block mytitle %}
    <title>主页</title>
    {% endblock %}
</head>
<body>
    {{ lst }}
    <a href="/music_index">音乐频道</a>    #注意:此处定义的是路由url,不是html普通超链接
    <a href="/sport_index">体育频道</a>    #注意:此处定义的是路由url,不是html普通超链接

    {% block info %}
        这是主页
    {% endblock %}

    <h3>有任何问题联系XXXX</h3>

</body>
#子模板继承父类,重写
{% extends 'base.html' %}

{% block mytitle %}
    <title>音乐频道</title>
{% endblock %}

{% block info %}
    欢迎来到音乐频道
{% endblock %}

模板的继承

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

URL反向解析

代码中url书写规范
1、绝对地址
   http://172.0.0.1:8000/page/1
2、相对地址
方式1
    
方式2
#HTML
<body>
    <a href="http://192.168.40.135:8000/test_url_result">绝对地址</a>
    <a href="/test_url_result">带'/'的相对地址</a>
    <a href="test_url_result">不带'/'的相对地址</a>

</body>
#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/<int:age>',views.test_url_result,name='tr')
#html
<a href="{% url 'tr' '100' %}">url反向解析版本</a>
#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 - 直接拼接访问路径
#绝对路径
<img src="http://192.168.40.135:8000/static/image/django.jpg" width="288px" height="288">
#相对路径
<img src="/static/image/django2.jpg" width="288px" height="288">
方案2—动态写法
通过{% static %}标签访问静态文件
1、加载static - {% load static %}
2、使用静态资源 - {% static '静态资源路径' %}
3、样例
<img src="{% static 'images/lena.jpg' %}">
#使用案例   
 {% load static %}
    <img src="{% static 'image/django2.jpg' %}" width="288" height="288">

什么是应用

    应用在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.创建分布式路由系统
    

应用下的模板

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

指定访问某个应用页面

在应用模板下创建与应用同名文件夹,然后将需要访问的页面存放在
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑马金牌编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值