Django后台框架1.3(模板渲染 if for url跳转)

模板的渲染

在1.2中Django的url通过return来返回网站的相关内容,返回html的话示例代码如下

from django.shortcuts import render

def temp(request):
    return render(request,'index.html')

注意,render中的request参数毕需传入,有了render函数之后,就可以摒弃掉之前用的HttpResponse函数了,其实render函数之中也调用了HttpResponse。

模板查找路径

在Django项目的配置文件setting.pyTEMPLATES变量列表中可以找到如下的代码

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',
            ],
        },
    },
]

其中 DIRS 规定了首先查找的位置,代码中python语言,意思就是在本项目的templates中找寻,没有找到的话会到如下的路径中查找,就在本变量的上面。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'front',
]

可以把创建的app导入,然后在app中构建目录templates,那么就会到我们的app中找,最后一行就是我在项目中构建的front前端app,其实可以把路径中的DIRS改为空,因为我们一般在进行网站开发的时候,前端和后端是分离的,如果都有index页面或者其他的相同的名字的模板的话,是一件非常麻烦的事情,所以,习惯性的删除主项目中的templates和查找的路径,然后再添加自己子app的相关路径。

参数传递

在render函数中可以用context进行参数传递,ctrl+B可以看一下函数的原型。

def render(request, template_name, context=None, content_type=None, status=None, using=None):
    """
    Return a HttpResponse whose content is filled with the result of calling
    django.template.loader.render_to_string() with the passed arguments.
    """
    content = loader.render_to_string(template_name, context, request, using=using)
    return HttpResponse(content, content_type, status)

第三个参数context就可以传入参数,其中参数可以以字典的方式进行呈现。

eg:
views.py

def temp(request):
    context = {
        'username': "小明"
    }
    return render(request,'index.html',context=context)

index.html

<p>{{ username }}</p>

直接通过字典的key来打印变量。

if语句

框架如下,大致语法和python相似,但是注意对于列表的引用,需要以 user.0 代替 user[0]

{% if username=='小明' %}
    
    {% elif %}
    
    {% else %}
    
{% endif %}

eg:

{% if '1' in person %}
    <p>测试if</p>
{% else %}
    <p>测试if</p>
{% endif %}

for语句

框架如下,大致语法和python也差不多

{% for person in person %}

{% endfor %}

eg:

{% for person in person %}
	<p>编号:{{ forloop.counter }}  内容: {{ person }}</p>
{% endfor %}

for语句拓展:

{% forloop.counter %}   # 计数从1开始
{% forloop.counter0 %}  # 计数从0开始
{% forloop.first %}     # 是否是第一个
{% forloop.last %}      # 是否是最后一个

{% empty %}             # 如果列表为空,渲染下面的代码

url跳转

总结以上,需要新添加一个页面的话有两步:

  • views.py中写好一个函数
  • urls.py中做好path路径的映射就可以了

但是如果在模板中跳转的话就需要另外再加一步了,就是模板中的url跳转,一般情况下url跳转都在a标签中,语法如下:

<a href="{% url 'app_name:views中的name' %}">Book</a>

有两点需要注意

  1. app_name如果你的项目中有多个子app,那么给不同的app命名之后,一定要加上app_name之后冒号加映射path的name,不然会踩坑。
  2. 同样的像上一篇Django1.2一样,对于映射的路径,最好给一个name这样方便修改,这里用的就是name

参数传递
views.py

def book_id(request,book_id):
    text = '图书ID为:%s' % book_id
    return HttpResponse(text)

urls.py

path('book/detail/<book_id>',views.book_id,name='detail'),

index.html

<a href="{% url 'front:detail' book_id='菜徐坤' %}">传参跳转</a>

字符串查询
views.py

def book_li(request):
    text = request.GET.get('li')
    return HttpResponse(text)

urls.py

path('book/li/',views.book_li,name='li')

index.html 注意查询字符串的位置

<li class="breadcrumb-item"><a href="{% url 'front:li' %}?li=a">?查询字符串跳转</a></li>

总结url跳转三板斧就可以搞定一个跳转了。

  1. 构建页面
  2. url映射
  3. 模板页面加链接

date过滤器
需要传入date类型的数据,可以使用python的datetime库来获取时间

{{ today|date:"Y/m/d" }}

在这里插入图片描述

模板继承

对于HTML中页面的共有部分可以写成一个父模板,然后子模版通过继承的方式来继承父模板,就可以省去很多代码。

base.html 父模板

<div class="container">
    {% block content %}
    	/*这里的content是block的名字,可以进行修改,子模版中要一致*/
		/*这里是接口  在子模版中可以向此处填充进内容*/
    {% endblock %}
</div>

index.html 子模版
extends为父模板的路径,然后注意block的名字要和父模板中对应的接口一致。

{% extends 'base.html' %}

{% block content %}
    <div>这是front文件中的</div>
{% endblock %}

静态文件的加载
django中可以使用相对路径的形式加载静态文件,也可以只用django提供的方法,需要注意三点

  1. 加载进来static标签
  2. 文件的路径一定要是static
  3. 如果static文件在子app中,那么这个app一定得配置到setting的INSTALLED_APPS
{% static '...' %}

需要在页面中加载进来static标签即可,加载方法

{% load static %}

当然,如果页面比较多的话,每个页面都要加上面的一行代码,很不舒服,所以可以在
setting–>TEMPLATES–>'OPTIONS’中加入

'builtins':['django.templatetags.static']

就可以自动为所有html配置static标签。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值