美文网首页
03--Django 视图与模版

03--Django 视图与模版

作者: Roger田翔 | 来源:发表于2019-08-14 20:01 被阅读0次

    一、Django 视图的高级使用

    在上一篇MTV的开发模式中,我们讲解了视图的基本用法,下面我们看一下进阶的用法

    1、采用 /add/?a=4&b=5 这样GET方法进行

    首先修改 views.py 文件,将GET获取的值进行运算

    from django.shortcuts import render
    from django.http import HttpResponse
     
    def add(request):
        a = request.GET['a']
        b = request.GET['b']
        c = int(a)+int(b)
        return HttpResponse(str(c))
    

    request.GET 类似于一个字典,request.GET.get('a', 0) 当没有传递 a 的时候默认 a 为 0

    修改 urls.py 文件,添加网址对应视图函数

    from django.contrib import admin
    from django.urls import path
    from calc import views as calc_views
     
    urlpatterns = [
        path('add/', calc_views.add, name='add'),  # new
        path('admin/', admin.site.urls),
    ]
    

    2、采用 /add/3/4/ 这样的网址的方式

    同样修改 views.py 文件,将后两个值作为参数传递给 new_add 方法

    def new_add(request, a, b):
        c = int(a) + int(b)
        return HttpResponse(str(c))
    

    修改 urls.py 文件,添加网址对应视图函数

    path('add/<int:a>/<int:b>/', calc_views.new_add, name='new_add'),

    用括号括起来的意思是保存为一个子组,每一个子组将作为一个参数,被 views.py 中的对应视图函数接收。
    int 表示接收 int 类型的参数,可以改为 str 类型。

    二、Django URL name详解

    path(r'^add/$', calc_views.add, name='add')
    path('add/<int:a>/<int:b>/', calc_views.new_add, name='new_add'),

    这里的 name='add' 是用来干什么的呢?

    • name 可以用于在 templates, models, views ……中得到对应的网址
    • 只要name不变,即使前面的网址变了也能通过名字获取到对应的网址

    name通常与reverse结对出现,reverse 接收 url 中的 name 作为第一个参数,获取对应的网址

    from django.urls import reverse
     
    reverse('new_add', args=(4,5))    # u'/add/4/5/'
    

    在网页模板中也是一样,可以很方便的使用

    不带参数的:
    {% url 'name' %}
    带参数的:参数可以是变量名
    {% url 'name' 参数 %}
     
    例如:
    <a href="{% url 'new_add' 4 5 %}">link</a>    # <a href="/add/4/5/">link</a>
    

    此外,还可以使用URL name做重定向

    def old_add2_redirect(request, a, b):
        return HttpResponseRedirect(
            reverse('new_add', args=(a, b))
        )
    

    urls.py中:

        path('old_add/<int:a>/<int:b>/', calc_views.old_add2_redirect),
        path('new_add/<int:a>/<int:b>/', calc_views.new_add, name='new_add'),
    

    三、Django 模版的高级使用

    1. 在网页上显示一个基本的字符串

    views.py
    def home(request):
        str = u"我在学习Django"
        return render(request, 'home.html', {'string': str})
    

    在视图中我们传递了一个字符串,在模板home.html中这样使用它:{{ 变量 }}

    home.html
    {{ string }}
    

    2. 基本的 for 循环 和 List内容的显示

    views.py
    def home(request):
        list = ["HTML", "CSS", "jQuery", "Python", "Django"]
        return render(request, 'home.html', {'htmllist': list})
    

    循环开始和结束都要使用 {% %}

    home.html
    教程列表:
    {% for i in htmllist %}
    {{ i }}
    {% endfor %}
    

    3. 显示字典中内容

    views.py
    def home(request):
        info_dict = {'blog': u'Python框架', 'content': u'Django'}
        return render(request, 'home.html', {'info_dict': info_dict})
    
    home.html
    博客:{{ info_dict.site }} 内容:{{ info_dict.content }}
    
    {% for key, value in info_dict.items %}
        {{ key }}: {{ value }}
    {% endfor %}
    

    4. 在模板进行 条件判断和 for 循环的详细操作

    views.py
    def home(request):
        List = map(str, range(100))    # 一个长度为100的 List
        return render(request, 'home.html', {'List': List})
    
    home.html
    {% for item in List %}
        {{ item }}{% if not forloop.last %},{% endif %} 
        {{ item }}, 
    {% endfor %}
    

    for循环中常用的函数

    变量 描述
    forloop.counter 索引从 1 开始算
    forloop.counter0 索引从 0 开始算
    forloop.revcounter 索引从最大长度到 1
    forloop.revcounter0 索引从最大长度到 0
    forloop.first 当遍历的元素为第一项时为真
    forloop.last 当遍历的元素为最后一项时为真
    forloop.parentloop 嵌套 for 循环,获取上一层 for 循环的 forloop

    当列表中可能为空值时用 for empty

    {% for athlete in athlete_list %}
        <li>{{ athlete.name }}</li>
    {% empty %}
        <li>抱歉,列表为空</li>
    {% endfor %}
    

    5. 模板上得到视图对应的网址

    在上面的URL name章节已经提到过

    不带参数的:
    {% url 'name' %}
    带参数的:参数可以是变量名
    {% url 'name' 参数 %}
    
    <a href="{% url 'new_add' 4 5 %}">link</a>    # <a href="/add/4/5/">link</a>
    

    还可以使用 as 语句将内容取别名(相当于定义一个变量),多次使用(但视图名称到网址转换只进行了一次)

    {% url 'home' as the_url %}
    <a href="{{ the_url }}">链接到:{{ the_url }}</a>
    

    6. 模板中的逻辑操作

    • ==, !=, >=, <=, >, < 可以在模板中使用
    • and, or, not, in, not in 也可以在模板中使用
    • 比较符号前后必须有至少一个空格

    假如我们判断 num 是不是在 0 到 100 之间:

    {% if num <= 100 and num >= 0 %}
    num在0到100之间
    {% else %}
    数值不在范围之内!
    {% endif %}
    

    假如我们判断 'Python' 在不在一个列表变量 List 中:

    {% if 'Python' in List %}
    Python在名单中
    {% endif %}
    

    7. 模板中 获取当前网址,当前用户等:

    如果不是在 views.py 中用的 render函数,是 render_to_response 的话,需要将 request 加入到 上下文渲染器(点击查看详细)

    TEMPLATES = [
        {
                    'django.template.context_processors.request',
        },
    ]
    

    然后在 模板中我们就可以用 request 了。一般情况下,推荐用 render而不是用 render_to_response
    7.1 获取当前用户:

    {{ request.user }}

    如果登陆就显示内容,不登陆就不显示内容:

    {% if request.user.is_authenticated %}
        {{ request.user.username }},您好!
    {% else %}
        请登陆,这里放登陆链接
    {% endif %}
    

    7.2 获取当前网址:

    {{ request.path }}

    7.3 获取当前 GET 参数:

    {{ request.GET.urlencode }}

    相关文章

      网友评论

          本文标题:03--Django 视图与模版

          本文链接:https://www.haomeiwen.com/subject/dljgfctx.html