Django2与Django3之间的不同

最近在复现别人django的一个电商系统项目,他用的是django2,而我使用的是django3。在调试的过程中,由于这两个版本之间某些语法或者是要求的不同,出现了很多bug。

从现在开始,这篇博文会写一些我在探索过程中对django2和django3不同点的总结。

一、url()与path()

*url()path()*都是用于实例化urlpatterns的函数。url()是在django1、django2中使用,并且在API文档中明确指出,在将来的版本中可能不推荐使用,他还有一个别名为re_path()path()是django3中使用的函数,是url()的替代品。

首先需要知道几个问题:

1、urlpatterns是url配置URLconf中的一个列表,网站生成的请求会遍历urlpartterns寻找匹配的链接,遇到第一个会停下来。然后调用对应的view函数,返回对应的页面。

2、URLconf指的是默认生成的urls.py文件,在项目初始化(startproject)和应用初始化(startapp)时分别生成。

  • *path(route , view , kwargs = None , name = None)*

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tHIi2O9B-1581751270259)(https://i.loli.net/2020/02/15/Tjc9J8P25EiA3eC.png)]

    path()函数返回要包含在urlpatterns中的元素。

    route参数应该是一个字符串,包含了一个URL模式。该字符串可能包含尖括号(eg:< username >),以捕获URL的一部分并将其作为关键字参数发送到view。尖括号可包含转换器规范(eg:< int:year >),该规范限制了匹配的字符,还可以更改传递给视图的变量的类型。例如,< int : year>匹配一串十进制数字并将该值转换为int。

    view参数是一个视图函数或是结果为基于类的视图的as_view()。它也可以是一个django.urls.include()

    include()函数是在调用项目中应用的URLconf(也就是对应应用下的urls.py文件)。

    kwargs参数可以将其他参数以字典的形式传递给视图函数。route参数中匹配的关键字、转换器规范转换的匹配字符都是通过kwargs参数来传递。这个参数不是关键参数,可以忽略。

    name参数可以给这个url取一个合适的名字。通过给url取名字,以后在view或者模板中使用这个url,就只需要通过这个名字就可以了。这样做的原因是防止url更改,会导致其他用了这个url的地方都需要更改,但是如果取名字了,就不要做任何改动了。这个参数不是关键参数,可以忽略。

    附:在python编码中,使用 url = reverse(name) 进行查找 name 对应的url,然后可以用 redirect(url) 进行重定向。

  • re_path(route, view, kwargs=None, name=None) / url(route, view, kwargs=None, name=None)

    url()函数也是返回要包含在urlpatterns中的元素。

    其中view、kwargs、name参数与path的用法相同,不同点在于route参数的使用。

    route参数是一个字符串参数,包含与Python的兼容的正则表达式 re 模块。字符串通常使用原始字符串语法(r''),以便它们可以包含类似\d的序列,而无需用另一个反斜杠转义反斜杠。进行匹配时,将从正则表达式中捕获的组传递给视图-如果组已命名,则作为命名参数,否则传递为位置参数。这些值将作为字符串传递,而不进行任何类型转换。这样就导致需要掌握正则表达式这个前导知识。

二、{% load staticfiles %}与{% load static %}

这两个都是在html文件中的语句,具体的语法我不了解,但我认为应该是加载静态文件目录的语句。当我使用{% load staticfiles %}的时候,网页会出现错误:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PHoSI3V6-1581751270260)(https://i.loli.net/2020/02/15/Xm1unhlTbUwS9qs.png)]

百度后得知,这是由于{% load staticfiles %}是django2.1就已经被弃用(不建议使用),并且在django3中直接移除,所以才会出现这样的错误。只需要将它改成{% load static %}就可以。

同样的,

{% load staticfiles %}
{% load static from staticfiles %}
{% load admin_static %}

也是相同的情况,不能在django3中使用,都需要将他们替换成{% load static %}

你可能感兴趣的:(Django学习)