django:模板

1.django模板 DTL(Django Template Language)

加载模板的2种方式
1.进入虚拟环境 创建day3文件夹 创建项目djang_templates 在项目中创建app:book

(Django框架-M7PXHVMJ) E:\Django框架>cd day3

(Django框架-M7PXHVMJ) E:\Django框架\day3>django-admin startproject djang_templates

(Django框架-M7PXHVMJ) E:\Django框架\day3>cd djang_templates

(Django框架-M7PXHVMJ) E:\Django框架\day3\djang_templates>python 

manage.py startapp book

(Django框架-M7PXHVMJ) E:\Django框架\day3\djang_templates>python manage.py migrate

2.在app中创建urls.py文件,在项目总urls.py中配置app路由


image.png

3.在app中book.views.py 中定义2个函数
3.1.1 先导入2中方法,通过2中方法创建2个函数
a:from django.shortcuts import render
b: from django.template.loader import render_to_string
代码如下:

from django.shortcuts import render
from django.http import HttpResponse
from django.template.loader import render_to_string


def index(request):
    # return HttpResponse('图书首页')
    html = render_to_string('index.html')
    return HttpResponse(html)
def book(request):
    return render(request, 'book.html')
image.png

4.在项目总文件夹下项目djang_templates 创建templates文件夹
在templates文件夹中创建2个对应的html文件:index.html book.html
html的title修改为‘图示首页’ ‘book’ 以示区别


image.png

image.png

5.在项目setting.py中设置文件配置templates文件夹的路径,以便找到此文件夹中的html文集。配置代码如下:

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

image.png

6.启动manage.py ,启动前别忘记配置manage.py
image.png

7.浏览器中输入访问地址:
http://127.0.0.1:8000/book/
image.png

http://127.0.0.1:8000/book/book/
image.png

2. 模板的查询路径配置

在项目的settings.py文件中。有一个TEMPLATES配置,这个配置包含了模板引擎的配置,模板查找路径的配置,模板上下文的配置等。模板路径可以在两个地方配置。
1.DIRS:这是一个列表,在这个列表中可以存放所有的模板路径,以后在视图中使用render或者render_to_string渲染模板的时候,会在这个列表的路径中查找模板。


image.png

2.APP_DIRS:默认为True,这个设置为True后,会在INSTALLED_APPS的安装了的APP下的templates文件加中查找模板。settings.py中INSTALLED_APPS数组中添加你的app名字。


image.png

3.查找顺序:比如代码render('list.html')。先会在DIRS这个列表中依次查找路径下有没有这个模板,如果有,就返回。如果DIRS列表中所有的路径都没有找到,那么会先检查当前这个视图所处的app是否已经安装,如果已经安装了,那么就先在当前这个app下的templates文件夹中查找模板,如果没有找到,那么会在其他已经安装了的app中查找。如果所有路径下都没有找到,那么会抛出一个TemplateDoesNotExist的异常。

3. DTL模板语法


class Dog(object):
    def __init__(self, name):
        self.name = name


def index(request):

   # return HttpResponse('图书首页')

    dog = Dog('中华田园犬')

    html = render_to_string('index.html')

    return HttpResponse(html)


def book(request):
    context = {'username': 'cheney',
               'books': ['san', 'shui', 'xi', 'hong'],
               'logo': {'name': 'logic'
                },
               'dog': Dog('中华田园犬'),
               }
    return render(request, 'book.html', context=context)

http://127.0.0.1:8000/book/book/

image.png

模板中的变量同样也支持点(.)的形式。在出现了点的情况,比如person.username,模板是按照以下方式进行解析的

1.如果person是一个字典,那么就会查找这个字典的username这个key对应的值。
2.如果person是一个对象,那么就会查找这个对象的username属性,或者是username这个方法。
3.如果出现的是person.1,会判断persons是否是一个列表或者元组或者任意的可以通过下标访问的对象,
如果是的话就取这个列表的第1个值。如果不是就获取到的是一个空的字符串。

4.常用模板标签

1.if标签:if标签相当于Python中的if语句,有elif和else相对应,但是所有的标签都需要用标签符号({%%})进行包裹。if标签中可以使用==、!=、<、<=、>、>=、in、not in、is、is not等判断运算符。

{% if age > 18 %}
    <p>您是成年人了</p>
{% elif age == 18 %}
    <p>您刚满18岁</p>
{% else %}
    <p>您是未成年人</p>
{% endif %}

{% if "张三" in persons %}
    <p>张三</p>
{% else %}
    <p>李四</p>
{% endif %}

2.for...in...标签:for...in...类似于Python中的for...in...。可以遍历列表、元组、字符串、字典等一切可以遍历的对象。

{% for book in books %}
    <p>{{ book }}</p>
{% endfor %}

# 反向遍历
{% for book in books reversed %}
    <p>{{ book }}</p>
{% endfor %}

遍历字典的时候,需要使用items、keys和values等方法。在DTL中,执行一个方法不能使用圆括号的形式。

{% for key,value in person.items %}
    <p>key:{{ key }}</p>
    <p>value:{{ value }}</p>
{% endfor %}

在for循环中,DTL提供了一些变量可供使用。

forloop.counter:当前循环的下标。以1作为起始值。
forloop.counter0:当前循环的下标。以0作为起始值。
forloop.revcounter:当前循环的反向下标值。比如列表有5个元素,那么第一次遍历这个属性是等于5,第二次是4,以此类推。并且是以1作为最后一个元素的下标。
forloop.revcounter0:类似于forloop.revcounter。不同的是最后一个元素的下标是从0开始。
forloop.first:是否是第一次遍历。
forloop.last:是否是最后一次遍历。
forloop.parentloop:如果有多个循环嵌套,那么这个属性代表的是上一级的for循环。

3.for...in...empty标签:这个标签使用跟for...in...是一样的,只不过是在遍历的对象如果没有元素的情况下,会执行empty中的内容。

{% for person in persons %}
    <li>{{ person }}</li>
{% empty %}
    暂时还没有任何人
{% endfor %}

注意:在for循环中,break,continue语句是用不了的。

4.url标签:在模版中,我们经常要写一些url,比如某个a标签中需要定义href属性。当然如果通过硬编码的方式直接将这个url写死在里面也是可以的。但是这样对于以后项目维护可能不是一件好事。因此建议使用这种反转的方式来实现,类似于django中的reverse一样。
<a href="{% url 'book:list' %}">图书列表页面</a>

如果url反转的时候需要传递参数,那么可以在后面传递。但是参数分位置参数和关键字参数。位置参数和关键字参数不能同时使用。

# path部分
path('detail/<book_id>/',views.book_detail,name='detail')

# url反转,使用位置参数
<a href="{% url 'book:detail' 1 %}">图书详情页面</a>

# url反转,使用关键字参数
<a href="{% url 'book:detail' book_id=1 %}">图书详情页面</a>

如果想要在使用url标签反转的时候要传递查询字符串的参数,那么必须要手动在在后面添加。

<a href="{% url 'book:detail' book_id=1 %}?page=1">图书详情页面</a>

如果需要传递多个参数,那么通过空格的方式进行分隔。

<a href="{% url 'book:detail' book_id=1 page=2 %}">图书详情页面</a>

more detail please refer:
(https://docs.djangoproject.com/en/2.0/ref/templates/builtins/)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Django视图函数不只是直接返回文本,在实际生产环境中其实很少这样使用,因为实际的页面大多是带有样式的HTML代...
    成长之路丶阅读 374评论 0 0
  • 模板 作为Web框架,Django提供了模板,用于编写html代码,还可以嵌入模板代码更快更方便的完成页面开发,再...
    錦魚阅读 2,305评论 0 0
  • 目前市面上有非常多的模板系统,其中最知名最好用的就是DTL和Jinja2。DTL是Django Template ...
    小短腿电工阅读 507评论 0 0
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,613评论 0 11
  • 彩排完,天已黑
    刘凯书法阅读 4,277评论 1 3