一、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 }}
网友评论