Django视图

一、url路由

自上而下的,如果匹配的路由中是包含int转换器,则不能匹配其他的不是int的相关字符,譬如文字等;

自定义路由转换器:

1、创建一个converter.py的文件;

2、再写一个类:

class FourDigitYearConverter:

regex = '[0-9]{4}' # 类属性,一个字符串形式的正则表达式属性

def to_python(self, value): # 一个用来将字符串转换成你想要的那个数据类型,并传给视图;如果转换失败,它必须弹出ValueError异常。

return int(value)

def to_url(self, value): # 将Python数据类型转换成一段url的方法,与上面方法相反;如果转换失败,它也必须弹出ValueError异常。

return '%04d' % value

3、在该APP的url中注册它:

register_converter(converters.FourDigitYearConverter, 'yyyy')

使用样式:path('articles/yyyy:year/', views.year_archive)

在路由中使用正则表达式:语法是 (?Ppattern) ,其中 name 是组名,pattern 是要匹配的模式。

例如:re_path(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/(?P[\w-]+)/$', views.article_detail)

二、路由转发

路由中的命名最好不要和路径的url一样,不然有可能导致错误。

可以在include后面加上一个字典参数,但是该参数必须是各个子路由都会使用的,不然可能会出错。

三、反向解析和命名空间

1、反向解析url

def redirect_to_year(request):

...

year = 2020

...

return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))

2、命名空间app_name和namespace:

在模板中使用的时候,用冒号隔开;

namespace定义在include中;整个项目的所有app中的所有namespace不能重名,也就是全局唯一;使用namespace功能的前提是设置app_name,如果不设置,会弹出异常;要在视图中获取namespace属性值,通过request.resolver_match.namespace。

四、函数视图及快捷方式

1、返回错误HttpResponseNotFound( );

Http404异常,返回Http404异常的时候需要用raise不能用return;

自定义各种错误页面:

#在子路由增加的条目

handler400 = views.bad_request

handler403 = views.permission_denied

handler404 = views.page_not_found

handler500 = views.error

然后在views中增加:

@requires_csrf_token

def bad_request(request, exception):

return render(request, '400.html')

2、内置的快捷方法

render(request,template_name,, context=None, content_type=None, status=None, using=None)

必需参数:

● request:视图函数处理的当前请求,封装了请求头的所有数据,其实就是视图参数request。

● template_name:要使用的模板的完整名称或者模板名称的列表。如果是一个列表,将使用其中能够查找到的第一个模板。

可选参数:

● context:添加到模板上下文的一个数据字典。默认是一个空字典。可以将认可需要提供给模板的数据以字典的格式添加进去。这里有个小技巧,使用Python内置的locals()方法,可以方便地将函数作用域内的所有变量一次性添加进去。

● content_type:用于生成的文档的MIME类型。 默认为DEFAULT_CONTENT_TYPE设置的值,也就是'text/html'。

● status:响应的状态代码。 默认为200。

● using:用于加载模板使用的模板引擎的NAME。

def my_view(request):

View code here...

return render(request, 'myapp/index.html', { 'foo': 'bar', }, content_type='application/xhtml+xml')

等同于:

def my_view(request):

View code here...

t = loader.get_template('myapp/index.html')

c = {'foo': 'bar'}

return HttpResponse(t.render(c, request), content_type='application/xhtml+xml')

重定向------redirect()

redirect(to, args, permanent=False, *kwargs)

根据传递进来的url参数,返回HttpResponseRedirect。

参数to可以是:

● 一个模型实例:将调用模型的get_absolute_url()函数,反向解析出目的url;

● URL的name名称:可能带有参数:reverse()将用于反向解析url;

● 一个绝对的或相对的URL:将原封不动的作为重定向的目标位置。

默认情况下是临时重定向,如果设置permanent=True将永久重定向。

相关推荐
云飞云共享云桌面2 小时前
高性能图形工作站的资源如何共享给10个SolidWorks研发设计用
linux·运维·服务器·前端·网络·数据库·人工智能
2501_927993532 小时前
SQL Server 2022安装详细教程(图文详解,非常详细)
数据库·sqlserver
wqq63108552 小时前
Python基于Vue的实验室管理系统 django flask pycharm
vue.js·python·django
星火s漫天2 小时前
第一篇: 使用Docker部署flask项目(Flask + DB 容器化)
数据库·docker·flask
Q_Q19632884752 小时前
python大学生爱心校园互助代购网站_nyvlx_django Flask vue pycharm项目
python·django·flask
xcLeigh2 小时前
Python 项目实战:用 Flask 实现 MySQL 数据库增删改查 API
数据库·python·mysql·flask·教程·python3
威迪斯特2 小时前
Flask:轻量级Web框架的技术本质与工程实践
前端·数据库·后端·python·flask·开发框架·核心架构
xu_yule2 小时前
Redis存储(15)Redis的应用_分布式锁_Lua脚本/Redlock算法
数据库·redis·分布式
一灰灰blog2 小时前
Spring AI中的多轮对话艺术:让大模型主动提问获取明确需求
数据库·人工智能·spring
Nandeska3 小时前
15、基于MySQL的组复制
数据库·mysql