2024年Python教程:十分钟入门Django模板,程序员面试流程

本文介绍了IT技术中的模板变量、模板上下文、模板标签、过滤器,包括自定义过滤器的创建和使用,以及模板继承、HTML转义、验证码实现和URL反向解析等概念。同时强调了系统化学习的重要性,提供了一套针对IT行业学习者的资源和社群支持。
摘要由CSDN通过智能技术生成

最后

🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。
🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

模板语言简称为DTL。(Django Template Language)

模板变量

模板变量名是由数字,字母,下划线和点组成的,不能以下划线开头。

使用模板变量:

{{模板变量名}}

模板变量的解析顺序:

例如:{{ book.btitle }}

  • 1)首先把book当成一个字典,把btitle当成键名,进行取值book[‘btitle’]

  • 2)把book当成一个对象,把btitle当成属性,进行取值book.btitle

  • 3)把book当成一个对象,把btitle当成对象的方法,进行取值book.btitle

例如:{{book.0}}

  • 1)首先把book当成一个字典,把0当成键名,进行取值book[0]

  • 2)把book当成一个列表,把0当成下标,进行取值book[0]

如果解析失败,则产生内容时用空字符串填充模板变量。

使用模板变量时,.前面的可能是一个字典,可能是一个对象,还可能是一个列表。

使用模板变量示例

模板变量函数

def temp_var(request):

“”“模板变量”“”

my_dict = {“title”: “字典键值”}

my_list = [1, 2, 3]

book = models.BookInfo.objects.get(id=1)

定义模板上下文

context = {‘my_dict’: my_dict, ‘my_list’: my_list, ‘book’: book}

return render(request, ‘booktest/temp_var.html’, context)

模板变量html代码(booktest/temp_var.html)

模板变量

使用字典属性:{{ my_dict.title }}

使用列表元素:{{ my_list.1 }}

使用对象属性:{{ book.btitle }}

模板标签

模板标签使用格式:

{% 代码段 %}

for循环:

{% for x in 列表 %}

列表不为空时执行

{% empty %}

列表为空时执行

{% endfor %}

可以通过{{ forloop.counter }}得到for循环遍历到了第几次。

if判断:

{% if 条件 %}

{% elif 条件 %}

{% else %}

{% endif %}

关系比较操作符:> < >= <= == !=

注意:进行比较操作时,比较操作符两边必须有空格。

逻辑运算:not and or

django内置标签与过滤器文档:内置标签与过滤器文档 或者 https://yiyibooks.cn/xx/django_182/ref/templates/builtins.html

模板标签使用示例

函数

def temp_tags(request):

“”“模板标签”“”

books = models.BookInfo.objects.all()

return render(request, ‘booktest/temp_tags.html’, {‘books’: books})

html代码

模板标签

模板标签

    {% for book in books %}

    {% if book.id <= 2 %}

    • {{ forloop.counter }}--{{ book.btitle }}
    • {% elif book.id <= 3 %}

    • {{ forloop.counter }}--{{ book.btitle }}
    • {% else %}

    • {{ forloop.counter }}--{{ book.btitle }}
    • {% endif %}

      {% endfor %}

      booktest/temp_tags.html

      过滤器

      过滤器其实就是python函数。

      过滤器用于对模板变量进行操作。

      • date:改变日期的显示格式。

      • length:求长度。字符串,列表.

      • default:设置模板变量的默认值。

      格式:

      模板变量|过滤器:参数

      自定义过滤器。

      自定义的过滤器函数,至少有一个参数,最多两个

      过滤器的使用示例

      过滤器函数

      def temp_filter(request):

      “”“模板过滤器”“”

      books = models.BookInfo.objects.all()

      return render(request, ‘booktest/temp_filter.html’, {‘books’: books})

      过滤器html代码

      模板过滤器

      模板标签

        {% for book in books %}

        {% if book.id <= 2 %}

      • {{ book.btitle }}--{{ book.bpub_date|date:'Y-m-d' }}
      • {% else %}

        {# 加了length后,会将原来的图书名编程图书名长度的数字 #}

      • {{ book.btitle|length }}--{{ book.bpub_date }}
      • {% endif %}

        {% endfor %}

        default过滤器:

        {# 如果content没有值,则过滤器会显示默认的值 #}

        {{ content|default:“hello” }}

        booktest/temp_filter.html

        注意:过滤器中,冒号后不能加空格,

        例如{{ book.bpub_date|date:‘Y-m-d’ }}是正确的,而{{ book.bpub_date|date: ‘Y-m-d’ }}是错误的。

        否则会报错,Could not parse the remainder: ‘: ‘Y-m-d’’ from ‘book.bpub_date|date: ‘Y-m-d’’

        自定义过滤器

        自定义过滤器

        • 1.在自己的应用下面新建一个 templatetags 文件夹,名字固定;

        • 2.在templatetags文件夹下面新建一个py文件,名字自定义,比如filters.py;

        • 3.1.在文件中,引入Library类;

        • 3.2.创建一个Library类的对象;

        • 3.3.定义自己的函数,给函数添加装饰器@register.filter进行过滤器装饰;

        使用自定义装饰器

        • 1.在需要使用的html文件中导入自定义装饰器文件,{% load filters %},即 load 文件名;

        • 2.使用过滤器;

        自定义过滤器示例

        import django.template

        创建一个Library类的对象

        register = django.template.Library()

        @register.filter

        def mod(num):

        “”“判断num是否为偶数”“”

        如果传过来的num是偶数,则返回True,否则返回False

        return num % 2 == 0

        在html代码中使用模板过滤器

        {% load filters %}

        模板过滤器

        模板标签

          {% for book in books %}

          {% if book.id|mod %}

        • {{ book.id }}--{{ book.btitle }}--{{ book.bpub_date|date:'Y-m-d' }}
        • {% else %}

        • {{ book.btitle }}--{{ book.bpub_date }}
        • {% endif %}

          {% endfor %}

          html使用一个参数的过滤器

          两个参数的自定义过滤器

          自定义过滤器

          自定义的过滤器,最少有一个参数,最多有两个参数

          只有一个参数的话,由|前面的参数传过来,两个参数的话,:后面再跟一个参数

          应注意过滤器参数的前后顺序

          @register.filter

          def mod_val(num, val):

          “”“判断num是否能把value整除”“”

          return num % val == 0

          html代码

          {% load filters %}

          模板过滤器

          模板标签

            {% for book in books %}

            {# {% if book.id <= 2 %} #}

            {# % if book.id|mod %} #}

            {% if book.id|mod_val:3 %}

          • {{ book.id }}--{{ book.btitle }}--{{ book.bpub_date|date:'Y-m-d' }}
          • {% else %}

            {# 加了length后,会将原来的图书名编程图书名长度的数字 #}

          • {{ book.btitle|length }}--{{ book.bpub_date }}
          • {% endif %}

            {% endfor %}

            default过滤器:

            {# 如果content没有值,则过滤器会显示默认的值 #}

            {{ content|default:“hello” }}

            html使用两个参数的自定义过滤器

            模板继承


            模板继承也是为了重用html页面内容。

            在父模板里可以定义块,使用标签:

            {% block 块名 %}

            块中间可以写内容,也可以不写

            {% endblock 块名%}

            子模板去继承父模板之后,可以重写父模板中的某一块的内容。

            继承格式:

            {% extends 父模板文件路径%}

            {% block 块名 %}

            {{ block.super}} #获取父模板中块的默认内容

            重写的内容

            {% endblock 块名%}

            模板继承示例

            base/母模板

            {% block title %}base模板文件的title{% endblock title %}

            base模板的header

            {% block b1 %}

            base模板的block1

            {% endblock b1 %}

            {% block b2 %}

            base模板的block1

            {% endblock b2 %}

            base模板的footer

            child/子模板

            {% extends ‘booktest/base.html’ %}

            {% block title %}child模板中的title{% endblock title %}

            {% block b1 %}

            {{ block.super }}

            child模板的block1

            {% endblock b1 %}

            {% block b2 %}

            child模板的block2

            {% endblock b2 %}

            配套函数

            def temp_inherit(request):

            “”“返回child模板继承于base的文件”“”

            return render(request, ‘booktest/child.html’)

            在块里面还可以写块,需要注意endblock后面跟 块名 用以区分哪个块结束。

            html转义


            场景:编辑商品详情信息,数据表中保存的是html内容。

            在模板上下文中的html标记默认是会被转义的。

            小于号< 转换为<

            大于号> 转换为>

            单引号’ 转换为’

            双引号" 转换为 "

            与符号& 转换为 &

            要关闭模板上下文字符串的转义:可以使用

            {{ 模板变量|safe}}

            也可以使用:

            {% autoescape off %}

            模板语言代码

            {% endautoescape %}

            模板硬编码中的字符串默认不会经过转义,如果需要转义,那需要手动进行转义。

            safe和autoescape的区别在于,safe只能转义一个模板变量,而autoescape可以转义多个变量;

            html转义示例

            html_escape.html

            模板转义

            html转义结果:

            {{ content }}

            使用safe过滤器关闭转义结果:

            {{ content|safe }}

            使用autoescape关闭转义结果:

            {% autoescape off %}

            {{ content }}

            {{ content }}

            {% endautoescape %}

            模板硬编码中的字符串默认不会转义,即会经过html渲染:

            {{ test|default:‘

            hello

            ’ }}

            手动对硬编码进行转义:

            {{ test|default:‘<h1>hello</h1>’ }}

            配套函数

            /html_escape

            def html_escape(request):

            “”“模板转义”“”

            return render(request, ‘booktest/html_escape.html’, {‘content’: ‘

            hello

            ’})

            验证码


            在用户注册、登录页面,为了防止暴力请求,可以加入验证码功能,

            如果验证码错误,则不需要继续处理,可以减轻业务服务器、数据库服务器的压力。

            自实现验证码

            安装pillow

            pip install Pillow==3.4.1

            编写函数/视图

            from PIL import Image, ImageDraw, ImageFont

            from django.utils.six import BytesIO

            def verify_code(request):

            引入随机函数模块

            import random

            定义变量,用于画面的背景色、宽、高

            bgcolor = (random.randrange(20, 100), random.randrange(

            20, 100), 255)

            width = 100

            height = 25

            创建画面对象

            im = Image.new(‘RGB’, (width, height), bgcolor)

            创建画笔对象

            draw = ImageDraw.Draw(im)

            调用画笔的point()函数绘制噪点

            for i in range(0, 100):

            xy = (random.randrange(0, width), random.randrange(0, height))

            fill = (random.randrange(0, 255), 255, random.randrange(0, 255))

            draw.point(xy, fill=fill)

            定义验证码的备选值

            str1 = ‘ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0’

            随机选取4个值作为验证码

            rand_str = ‘’

            for i in range(0, 4):

            rand_str += str1[random.randrange(0, len(str1))]

            构造字体对象,ubuntu的字体路径为“/usr/share/fonts/truetype/freefont”

            font = ImageFont.truetype(‘FreeMono.ttf’, 23)

            构造字体颜色

            fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))

            绘制4个字

            draw.text((5, 2), rand_str[0], font=font, fill=fontcolor)

            draw.text((25, 2), rand_str[1], font=font, fill=fontcolor)

            draw.text((50, 2), rand_str[2], font=font, fill=fontcolor)

            draw.text((75, 2), rand_str[3], font=font, fill=fontcolor)

            释放画笔

            del draw

            存入session,用于做进一步验证

            request.session[‘verifycode’] = rand_str

            内存文件操作

            buf = BytesIO()

            将图片保存在内存中,文件类型为png

            im.save(buf, ‘png’)

            将内存中的图片数据返回给客户端,MIME类型为图片png

            return HttpResponse(buf.getvalue(), ‘image/png’)

            自实现验证码函数

            查看验证码

            url(r’^verify_code/$', views.verify_code),

            在网页中使用验证码

            Login

            {% csrf_token %}

            用户:

            密码:

            记住用户名


            html中使用验证码

            登录校验验证码函数

            def login_check(request):

            1.获取用户名和密码

            username = request.POST.get(“username”)

            password = request.POST.get(“password”)

            remember = request.POST.get(“remember”)

            print(username, password)

            获取用户输入的验证码

            vcode1 = request.POST.get(‘vcode’)

            获取session中保存的验证码

            vcode2 = request.session.get(‘verifycode’)

            进行验证码校验

            if vcode1 != vcode2:

            验证码错误

            return redirect(‘/login’)

            2.进行校验

            3.返回应答

            if username == “yifchan” and password == “yifchan”:

            response = redirect(“/index”)

            response = redirect(“/change_pwd”)

            判断是否需要记住用户名

            if remember == ‘on’:

            设置cookie username-过期时间为1周

            response.set_cookie(‘username’, username, max_age=7 * 24 * 3600)

            记住用户登录状态

            只有session中有islogin,就认为用户已经登录

            request.session[‘islogin’] = True

            request.session[‘username’] = username

            return response

            else:

            return HttpResponse(“账号或密码错误”)

            验证码校验函数

            url反向解析


            当某一个url配置的地址发生变化时,页面上使用反向解析生成地址的位置不需要发生变化。

            根据url 正则表达式的配置动态的生成url。

            在项目urls中包含具体应用的urls文件时指定namespace;

            urlpatterns = [

            url(r’^admin/', admin.site.urls),

            url(r’^', include(‘booktest.urls’, namespace=‘booktest’)),

            ]

            在应用的urls中配置是指定name;

            urlpatterns = [

            url(r’^index/$', views.index, name=‘index’),

            url(r’^url_reverse/$', views.url_reverse), #

            url(r’^show_args/(\d+)/(\d+)$', views.show_args, name=‘show_args’), # 捕获位置参数

            url(r’^show_kwargs/(?P\d+)/(?P\d+)$', views.show_kwargs, name=‘show_kwargs’), # 捕获关键字参数

            ]

            在模板文件中使用时,格式如下:

            {% url ‘namespace名字:name’ %} 例如{% url ‘booktest:fan2’ %}

            带位置参数:

            {% url ‘namespace名字:name’ 参数 %} 例如{% url ‘booktest:fan2’ 1 %}

            带关键字参数:

            {% url ‘namespace名字:name’ 关键字参数 %} 例如{% url ‘booktest:fan2’ id=1 %}

            在视图中/重定向的时候使用反向解析:

            在这里插入图片描述

            感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:

            ① 2000多本Python电子书(主流和经典的书籍应该都有了)

            ② Python标准库资料(最全中文版)

            ③ 项目源码(四五十个有趣且经典的练手项目及源码)

            ④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

            ⑤ Python学习路线图(告别不入流的学习)

            网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

            需要这份系统化学习资料的朋友,可以戳这里获取

            一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

          评论
          添加红包

          请填写红包祝福语或标题

          红包个数最小为10个

          红包金额最低5元

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

          抵扣说明:

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

          余额充值