• Python学习第121天(Django2的include使用)


    接着昨天关于include在Django1和2中的使用区别说,昨天介绍了Django1的使用,以及Django2的基本输入,今天就接着昨天详细说一下Django2的include发放问题。

    先回顾一下昨天的基本使用

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

    某些前缀一致的情况

    这种方法可以用来去除URLconf中的冗余,其中某个模式前缀被重复使用。例如,考虑这个URLconf:
    
    from django.urls import path
    from . import views
    
    urlpatterns = [
        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 views
    
    urlpatterns = [
        path('<page_slug>-<page_id>/', include([
            path('history/', views.history),
            path('edit/', views.edit),
            path('discuss/', views.discuss),
            path('permissions/', views.permissions),
        ])),
    ]

    反向解析

    from django.urls import path
    from . import views
    
    urlpatterns = [
        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 reverse
    
    def redirect_to_year(request):
        year = 2006
        return HttpResponseRedirect(reverse('archive', args=(year,)))

    命名空间

    注意:如果直接使用name做反向解析(即使用了include),也不需要设置app_name,但是使用namespace,需要设置app_name
    
    # 1.项目的urls
    from django.urls import path, include
    
    
    urlpatterns = [
        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 views
    
    app_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 reverse
    
    
    def 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 views
    
    app_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 reverse
    
    
    def 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

    以上加上昨天的内容就是全部的两者之间的区别,重在吸收吧,明天再彻底复习Django的视图模板部分的内容即可恢复正常学习进度。

    今天的集体学习真的是浪费时间啊。。。

  • 相关阅读:
    分享诗集中国原创诗歌创作分享中心,欢迎博客园喜欢诗词的加入【诗词在线】
    转让上海水族馆票【吐血转让】08年10月有效【100¥】
    winform 里Control.Margin 属性到底是干嘛的?
    亚交联盟注册指南
    sqlserver 替换回车换行
    如何配置 imail 中域名的MX记录
    张良、萧何与韩信:汉初三杰悲情录[转]
    FBD内存全局缓冲内存 比dd2 ecc还要好啊。服务器内存和普通PC内存的区别[转载]
    脆弱的ASP.NET AJAX
    无法连接到服务器。 帐户: 'mail.bb.cn', 服务器: '*******', 协议: SMTP, 端口: 25, 安全(SSL): 否, 套接字错误: 10061, 错误号: 0x800CCC0E
  • 原文地址:https://www.cnblogs.com/xiaoyaotx/p/13236613.html
Copyright © 2020-2023  润新知