一、路由的区别

1、Django1中的url

from django.conf.urls import url# 使用url关键字
urlpatterns = [url('article-(\d+).html',views.article),url('article-(?P<article_id>\d+).html',views.article)
]
# url请求地址为:http://127.0.0.1:8000/article-1.html

Django1的url支持正则匹配:
'article-(\d+).html':使用正则表达式的分组匹配来获取URL中的参数,并以位置参数形式传递给视图article。
'article-(?P<article_id>\d+).html':使用正则表达式的分组命名匹配来获取URL中的参数,并以关键字参数的形式传递给视图article。分组命名正则表达式组的语法是:(?P<name>pattern),其中name是组的名称(视图中的关键字参数必须跟组名一致),pattern是正则表达式。

2、Django2中的url

1.Django2特有的url

url规则:

  1. path写的是绝对字符串,请求地址必须与路由地址完全匹配
  2. 使用尖括号 <> 从url中获取参数值
  3. 可以使用转换器指定参数类型,例如: <int:age> 捕获一个整数参数age,
    若果没有转化器,将匹配任何字符串,也包括路径分隔符 /
  4. path拥有5个转换器:
    str:匹配除路径分隔符 / 外的字符串
    int:匹配自然数
    slug:匹配字母,数字,横杠及下划线组成的字符串
    uuid:匹配uuid形式的数据
    path:匹配任何字符串,包括路径分隔符 /
from django.urls import path# 使用path关键字
urlpatterns = [path('article-<int:article_id>.html',views.article),
]
# url请求地址为:http://127.0.0.1:8000/article-1.html

自定义转换器:
步骤:

  1. 自定义一个类
  2. 类中必须有:类属性regex,to_python方法,to_url方法
  3. regex:类属性,字符串类型
  4. to_python(self, value)方法:value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。
  5. to_url(self, value)方法:和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。

例如:

class Date:regex = '^0?[1-9]$|^1[0-2]$'def to_python(self, value):# 可以写你的逻辑,对匹配到的字符串进行处理value = '2019/' + valuereturn valuedef to_url(self, value):return '%2s' % value# 在主路由下导入,生成转换器
from django.urls import register_converterregister_converter(Date,'date')path('full-year/<date:full_year>/',views.full_year, name="full_year")

2.Django2的url兼容了Django1的写法

from django.urls import re_path
这里的re_path的用法跟Django1的url用法视完全一样的,匹配正则。urlpatterns = [path('articles/2003/', views.special_case_2003),  # Django2的写法re_path('articles/(?P<year>[0-9]{4})/', views.year_archive),  # 兼容Django1的写法re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/', views.month_archive),re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[^/]+)/', views.article_detail),
]

二、路由分发之include

1、Django1

1.include其他的URLconfs(二级路由系统)

创建两个app,每个app都创建一个urls.py# 项目的urls.py
from django.conf.urls import url, include
from app01 import urls as app01_urls
from app02 import urls as app02_urlsurlpatterns = [# 二级路由系统url(r'^app01/', include(app01_urls)),url(r'^app02/', include(app02_urls)),
]# app01的urls.py
from django.conf.urls import url
from app01 import viewsurlpatterns = [url(r'^book/$', views.book_list),url(r'^book/(?P<yyyy>[0-9]{4})/$', views.book),url(r'^blog/$', views.blog),url(r'^blog/(?P<num>\d+)/$', views.blog),
]# app02的urls.py
from django.conf.urls import url
from app02 import viewsurlpatterns = [url(r'^index/$', views.index),url(r'^home/$', views.home),
]解析:在浏览器输入http://127.0.0.1:8000/app02/home/
首先会拿着app02/home/去项目的urls中匹配,找到url(r'^app02/', include(app02_urls)),
看到include,就拿着home/去app02的urls中匹配,找到url(r'^home/$', views.home),就访问home页面。

2.命名URL和URL反向解析

在最终的路由那里设置name属性,给这个路由设置别名,
然后在视图函数那里导入from django.urls import reverse,
在需要解析地址的地方使用reverse(别名),就可以解析出这个url,
且无论路由本身的地址如何改变,只要使用reverse(别名),一样能解析出url地址

例如:

# 项目的urls.py
from django.conf.urls import url, include
from app02 import urls as app02_urlsurlpatterns = [# 二级路由系统url(r'^app02/', include(app02_urls)),
]# app02的urls.py
from django.conf.urls import url
from app02 import viewsurlpatterns = [url(r'^login/$', views.login),url(r'^index/$', views.index, name='myindex'),
]# views.py
from django.shortcuts import render, redirect, HttpResponse
from django.urls import reverse  # 导入reverse反向解析出地址def login(request):if request.method == 'POST':username = request.POST.get('username')pwd = request.POST.get('pwd')ret = UserInfo.objects.filter(username=username, pwd=pwd)if ret:return redirect(reverse('myindex'))  # reverse反向解析出url地址:/app02/index/return render(request, 'login.html')def index(request):return HttpResponse('index')解析:在浏览器输入http://127.0.0.1:8000/app02/login/,进入登录界面,
登录成功后,redirect(reverse('myindex')),reverse会根据别名myindex自动解析出index的具体路径(http://127.0.0.1:8000/app02/index/),
而且无论index的具体路由怎么改变,reverse('myindex')总是能解析出具体的url。注意:当url需要参数时:1.如果index需要传位置参数:
urlpatterns = [url(r'^index/(\d+)/$', views.index, name='myindex'),
]return redirect(reverse('myindex', args=('2018',)))2.如果index需要传关键字参数:
urlpatterns = [url(r'^index/(?P<year>\d+)/$', views.index, name='myindex'),
]return redirect(reverse('myindex', kwargs={'year': '2019'}))# 在HTML模板中使用
无参数:<a href="{% url 'myindex' %}">myindex</a>有参数:<a href="{% url 'myindex' '2018' %}">myindex</a>

3.命名空间模式

如果不同的APP使用了相同的URL反转名称,那么reverse怎么解析?
使用命名空间模式(namespace)可以解决这个问题,即不同的APP使用相同的URL名称,URL的命名空间模式也可以让你唯一反转命名的URL。

例如:

# 项目中的urls.py
from django.conf.urls import url, includeurlpatterns = [url(r'^app01/', include('app01.urls', namespace='app01')),url(r'^app02/', include('app02.urls', namespace='app02')),
]# app01中的urls.py
from django.conf.urls import url
from app01 import viewsurlpatterns = [url(r'^index/(?P<year>\d+)/$', views.index, name='myindex'),
]# app02中的urls.py
from django.conf.urls import url
from app02 import viewsurlpatterns = [url(r'^index/(?P<year>\d+)/$', views.index, name='myindex'),
]现在,两个app中url的别名重复了,反转URL的时候就可以通过命名空间的名称得到我当前的URL。
语法:
'命名空间名称:URL名称'# 在HTML模板中使用:
<a href="{% url 'app01:myindex' '2018' %}">app01 myindex</a>
<a href="{% url 'app02:myindex' '2019' %}">app02 myindex</a># 在views中的函数中使用
v = reverse('app01:myindex', kwargs={'year':2018})
v = reverse('app02:myindex', kwargs={'year':2019})这样即使app中URL的命名相同,我也可以反转得到正确的URL了。

2、Django2

1.基本使用

# In settings/urls/main.py
from django.urls import include, pathurlpatterns = [path('<username>/blog/', include('foo.urls.blog')),
]# In foo/urls/blog.py
from django.urls import path
from . import viewsurlpatterns = [path('', views.blog.index),path('archive/', views.blog.archive),
]

2.某些前缀一致的情况

这种方法可以用来去除URLconf中的冗余,其中某个模式前缀被重复使用。例如,考虑这个URLconf:from django.urls import path
from . import viewsurlpatterns = [path('<page_slug>-<page_id>/history/', views.history),path('<page_slug>-<page_id>/edit/', views.edit),path('<page_slug>-<page_id>/discuss/', views.discuss),path('<page_slug>-<page_id>/permissions/', views.permissions),
]
我们可以改进它,通过只声明共同的路径前缀一次并将后面的部分分组:from django.urls import include, path
from . import viewsurlpatterns = [path('<page_slug>-<page_id>/', include([path('history/', views.history),path('edit/', views.edit),path('discuss/', views.discuss),path('permissions/', views.permissions),])),
]

3.反向解析

from django.urls import path
from . import viewsurlpatterns = [path('articles/<int:year>/', views.year_archive, name='archive'),
]根据这种设计,对应于年度归档文件的URL是 /articles/<nnnn>/你可以使用以下方法在模板代码中获取这些:
<a href="{% url 'archive' 2012 %}">2012 Archive</a>或者在Python代码中:from django.http import HttpResponseRedirect
from django.urls import reversedef redirect_to_year(request):year = 2006return HttpResponseRedirect(reverse('archive', args=(year,)))

4.命名空间

注意:如果直接使用name做反向解析(即使用了include),也不需要设置app_name,但是使用namespace,需要设置app_name# 1.项目的urls
from django.urls import path, includeurlpatterns = [path('myapp/', include('MyApp.urls', namespace='my')),path('yourapp/', include('YourApp.urls', namespace='you')),
]# 2.1 MyApp.urls.py
from django.urls import path
from MyApp import viewsapp_name = 'myxxx'  # 在各个APP级别的urls中设置app_name

urlpatterns = [path('index/', views.index, name="index"),path('home/', views.home, name="home"),
]# 2.2 MyApp.Views.py
from django.shortcuts import render, redirect, HttpResponse
from django.urls import reversedef index(request):return HttpResponse("MyApp-index")def home(request):print("home")return redirect(reverse('my:index'))# return redirect(reverse('myxxx:index'))  # 也可以使用app_name# 3.1 YourApp.urls.py
from django.urls import path
from YourApp import viewsapp_name = 'yourxxx'  # 在各个APP级别的urls中设置app_name

urlpatterns = [path('index/', views.index, name="index"),path('hello/', views.hello, name="hello"),
]# 3.2 YourApp.Views.py
from django.shortcuts import render, redirect, HttpResponse
from django.urls import reversedef index(request):return HttpResponse("YourApp-index")def hello(request):print("hello")return redirect(reverse('you:index'))# return redirect(reverse('yourxxx:index'))  # 也可以使用app_name# 4. 在模板中使用
<a href="{% url 'my:index' %}">myapp-index</a>  # 可以写namespace
<a href="{% url 'yourxxx:index' %}">your-index</a>  # 可以写app_name

三、其他的一些区别

1、ORM外键

Django1.0:hbook = models.ForeignKey('BookInfo')
Django2.0:hbook = models.ForeignKey('BookInfo', on_delete=models.CASCADE)

转载于:https://www.cnblogs.com/Zzbj/p/11150041.html

Django1和2的区别相关推荐

  1. DAY74-Django框架(五)

    一.虚拟环境 对于一些需要跑在不同版本的模块下的项目,可以跑在虚拟环境中运行 创建虚拟环境的两种方法 pychanrm**创建 1.创建项目时选择使用虚拟环境 ​ 2.在已创建的项目中设置settin ...

  2. Django 应用程序 + 模型 + 基本数据访问

    如果你只是建造一个简单的web站点,那么可能你只需要一个app就可以了.如果是复杂的象 电子商务之类的Web站点,你可能需要把这些功能划分成不同的app,以便以后重用. 确实,你还可以不用创建app, ...

  3. Django1.x版本内的url 更新为Djan2.0的path产生的区别

    在urls.py中,自动导入模块,要注意的是: 1.在Django1.x版本中自动导入:from django.conf.urls import include, url 而在Django2.0版本自 ...

  4. Django1.7开发博客

    开篇 笔者用过django一段时间了,是时候做点笔记了.不过官网文档稍微有点复杂,对新手而言很困难, 而网上的一些教程很多都过时了. 最近看到一个外文的教程非常不错, 网址是:http://tutor ...

  5. 如何在Django1.6结合Python3.4版本中使用MySql

    唉,最近赶了个新潮,用起了Python3.4跟Django1.6,数据库依然是互联网企业常见的MySql. 悲催的是在Python2.7时代连接MySql的MySQLdb还不支持Python3.4,还 ...

  6. render与render_to_response的区别

    自django1.3开始:render()方法是render_to_response的一个崭新的快捷方式,前者会自动使用RequestContext.而后者必须coding出来,这是最明显的区别,当然 ...

  7. 如何在Django1.6结合Python3.3版本中使用MySql

    用起了Python3.4跟Django1.6,数据库依然是互联网企业常见的MySql. 悲催的是在Python2.7时代连接MySql的MySQLdb还不支持Python3.4,还好,苦苦追问G哥终于 ...

  8. Django1.11.4框架简介(一)

    参考以下内容学习 作者: 哥哥没有错,微信号 墨迹测试开发 Yong https://blog.csdn.net/Jones__Wu/article/details/105307097 https:/ ...

  9. Python3.5 Django1.10 Scrapy1.2 Ubuntu16.04 HTML5

    1.Python3.5 1. 虚拟环境 venv python3.4 创建虚拟环境(py3.4自带venv,不需要安装) Ubuntu 16.4 python3.5升级python3.6 sudo a ...

最新文章

  1. Can't create handler inside thread Thread that has not called Looper.prepare()
  2. HttpContext.Current:异步模式下的疑似陷阱之源
  3. 004_Spring Data JPA根据实例查询数据
  4. GDCM:gdcm::Testing的测试程序
  5. 【kaggle入门题一】Titanic: Machine Learning from Disaster
  6. 计算机工程与应用 网站,计算机工程与应用杂志
  7. Router_Cloud
  8. css3 flex布局九宫格,css3最全flex布局结构整理
  9. Pro Git CN Plus
  10. 网上支付失败了我该怎么办
  11. Day004 20210209-20210217
  12. 2019软件评测师考后经验分享
  13. 产品经理|竞品分析(附《竞品分析报告》模板)
  14. Android studio进行文件,代码对比
  15. 【Django】Specifying a namespace in include() without providing an app_name is not supported
  16. 斯坦福大学公开课IOS 7学习笔记 (1)
  17. Win10出现“你需要权限才能执行此操作”提示的解决方法--win7w.com
  18. 使用Cent Browser+Aria2+Bilibili Envolved下载b站视频--保姆级安装步骤
  19. vb6.0 清除IE浏览器缓存
  20. 加班奖金终于发下来了!3060显卡自费包邮送!

热门文章

  1. git服务器 修改url,如何更改Git Remote的URL
  2. adodb执行查询oracle慢,adodb.stream逐行读写过慢,求优化VBA
  3. 西电分布式系统考试复习
  4. js判断文件上传的类型
  5. 机器学习中的数据是什么?
  6. Primer 学习 -
  7. 容天服务器显示器没输出,电脑启动显示器无输出画面怎么办
  8. 金字塔图表 html,html+css实现分层金字塔的实例
  9. 中兴网络设备交换机路由器查看VRRP状态检查命令方法
  10. Guard Manager