03--Django 视图与模版

一、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///', 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///', 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' 参数 %}
 
例如:
link    # link

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

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

urls.py中:

    path('old_add///', calc_views.old_add2_redirect),
    path('new_add///', 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 %}
    
  • {{ athlete.name }}
  • {% empty %}
  • 抱歉,列表为空
  • {% endfor %}

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

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

    不带参数的:
    {% url 'name' %}
    带参数的:参数可以是变量名
    {% url 'name' 参数 %}
    
    link    # link
    

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

    {% url 'home' as the_url %}
    链接到:{{ the_url }}
    

    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 视图与模版)