Django学习笔记(五)

Django学习笔记(五)

MVC和MTV对比

传统的MVC(Model-View-Controller)
  • M 模型层,主要是对数据库层的封装
  • V 视图层,向用户展示结果
  • C 控制层,用于请求,获取数据和返回结果
Django的MTV
  • M 模型层,负责与数据库的交互

  • T 模板层,负责呈现到浏览器中

  • V 视图层是核心,负责接受请求,获取数据和返回结果

    -综上,他们的作用就是降低耦合度CMTV

模板

  1. 模板是可以根据字典数据动态变化的html网页
  2. 模板可以根据视图层中传递的字段数据动态生成相应的HTML网页
模板的配置
  • 在项目的同级目录下创建文件夹templates
  • 在settings.py中TEMPLATES配置项,需要配置’DIRS’: [os.path.join(BASE_DIR,‘templates’)],
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',
            ],
        },
    },
]
模板的加载
  • 方案一:通过loader获取模板,通过HttpRespons进行响应
    注意:需要导入loader模块
# 导入loader模块
from django.template import loader
# 通过loader加载模板
t = loader.get_template('模板文件名')
# 将t转换成HTML字符串
html = t.render(字典数据)
# 使用httpresponse 将html的字符串返回给浏览器
return HttpResponse(html)
  • 方案二:通过使用render()直接加载并响应模,这种方法比较常用
    -在视图函数中
from django.shortcuts import render
return  render(request,'模板名',字典数据)

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

  1. 视图函数中可以将python的变量封装到字典中传递到模板
    -样例
def xxx_vier(request)
	dic = {
		'变量1':'值1',
		'变量2':'值2',		
}
	return  rander(request,'xxx.html',dic)
  1. 在模板中,我们可以使用{{变量名}}的语法,调用视图函数传进来变量

模板层- 变量

模板的变量
  • str /int /list/tuple/dict/func/obj(类的实例化变量)
模板的调用方法
  • {{变量名}}

  • 获取列表中的某个值:{{变量名.index}}

  • 获取字典中的某个值:{{变量名.key}}

  • 如果是一个函数,返回他的返回值:{{对象.方法}}

  • {{函数名}}

    -练习

    def test_html_param(request):
     dic = {}
     dic['int'] = 88888888
     dic['str'] = 'wangxiaoning'
     dic['list'] = ['A', 'K', 'Q', 'J']
     dic['dict'] = {'a': 9, 'b': 8}
     dic['fun'] = say_hi
     dic['class_obj'] = Dog()
    
     return render(request, 'test_html_param.html', dic)
     def say_hi():
     return 'Hello'
     class Dog():
     def say(self):
         return '汪汪汪汪'
    
    
  <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h3>int : {{int}}</h3>
<h3>str : {{str}}</h3>
<h3>list : {{ list }}</h3>
<h3>list[0] : {{ list.0 }}</h3>
<h3>dict['a'] :{{ dict.a }} </h3>
<h3>fun : {{ fun }}</h3>
<h3>class_obj:{{ class_obj.say }}</h3>
</body>
</html>     
  • 结果
    在这里插入图片描述

模板-标签

  • 作用:将一些服务器的功能嵌入到模板中
  • 标签的语法:
    {%标签%}
    ..............
    {%结束标签%}
    
  • if 标签
     {%if 表达式1%}
     ...........
     {%elif 表达式2%}
     ..........
     {%endif%}

if条件表达式是可以用运算符,但是使用括号提高运算优先级在这里行不通了

  • for标签

        {% for 变量 in 可迭代对象%}
        ............循环语句
        {%empty%}
        ...........可迭代对象无数据时填充的语句
        {%endfor%}
    
    • 内置变量
    1. forloop.counter 循环的当前迭代(从1开始)
    2. forloop.counter0 循环的当前迭代(从0开始)
    3. forloop.revcounter counter值倒序
    4. forloop.recounter0 rercounter值倒序
    5. forloop.first 如果这是第一次通过循环,则为真
    6. forloop.last 如果这是最后一次循环,则为真
    7. forloop.parentloop 当嵌套循环,parenloop表示外层循环

下节学习,模板层的过滤器以及url的反向解析

初识ORM,配置和方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值