Django之urlconf路由

作者: ropon 分类: Django 发布时间: 2018-11-20 16:10
from django.contrib import admin
from django.urls import path

# 路由层URLconf
# 首先导入模块
from django.urls import re_path
# 然后导入项目下的视图
from app01 import views
# 配置路由
# 不含正则表达式 默认带开头结尾^$  用path
# 含正则表达式 用re_path

# urlpatterns = [
#     re_path(r'^$', views.index),
#     re_path('admin/', admin.site.urls),
#     re_path(r'^articles/2018/$', views.special_case_2018),
#     re_path(r'^articles/([0-9]{4})/$', views.year_achive),
#     re_path(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_achive),
#     re_path(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
# ]

# 若需要从URL中获取值,只需要在他周围添加一对圆括号() 比如([0-9]{4})、([0-9]{2})
# 不需要在最前面添加反斜杠/ 因为每个URL都有 正确的是 ^articles... 而不是^/articles...
# 每个正在表达式前面的'r' 告诉python不转义

# 请求URL articles/2018/11/ 请求将匹配列表第五个模式
# django 将调用视图函数 views.month_achive(request, '2018', '11')
# 请求URL articles/2018/11/123/ 请求将匹配列表第六个模式
# django 将调用视图函数 views.article_detail(request, '2018', '11', '123')

# 命名分组
# urlpatterns = [
#     re_path(r'^$', views.index),
#     re_path('admin/', admin.site.urls),
#     re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_achive),
#     re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_achive),
#     re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<id>[0-9]+)/$', views.article_detail),
# ]
# 获取的值作为关键字参数而不是位置参数传递给试图函数
# URLconf会更更加清晰而不会产生参数顺序问题
# 请求URL articles/2018/11/ 请求将匹配列表第四个模式 django
# 将调用视图函数 views.month_achive(request, year='2018', month='11')
# 请求URL articles/2018/11/123/ 请求将匹配列表第五个模式
# django 将调用视图函数 views.article_detail(request, year='2018', month='11', id='123')

# 分发
# 项目下url配置一个项目入口路由
# 项目下url再配置具体路由
# 首先导入模块
from django.urls import include
# 配置路由
urlpatterns = [
    re_path(r'^$', views.index),
    # 配置分发
    re_path(r'^app01/', include('app01.urls', namespace='app01')),
    re_path(r'^app02/', include('app02.urls', namespace='app02')),
    re_path('^admin/', admin.site.urls),
]

# 命名空间namespace='app01'
# 注意对应项目下urls文件需要配置app_name = 'app01'

app01/urls

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/11/20 14:08
# @Author  : Ropon
# @File    : urls.py
from django.urls import re_path
from . import views
app_name = 'app01'
urlpatterns = [
    re_path(r'^index/', views.index, name='index'),
    re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_achive, name='news_year_achive'),
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_achive, name='news_month_achive'),
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<id>[0-9]+)/$', views.article_detail),
]

# url反向解析
# 根url 配置re_path(r'^app01/', include('app01.urls', namespace='app01')),
# 项目url 配置re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_achive, name='news_year_achive'),
# 注意 urls.py文件中必须声明app_name

# 模板中使用{% url 'app01:news_year_achive' year=year %}
# 如果存在参数传值
#     关键字参数值 在后面加key=value 多个参数使用空格隔开 如year=2018 month=11 {% url 'app01:news_year_achive' year=year %}
#     位置参数 在后面加参数值 多个参数使用空格隔开 2018 11 {% url 'app01:news_year_achive' 2018 %}

# 在视图及python中使用
# def year_achive(request, year=None):
#     month = 12
#     return HttpResponseRedirect(reverse('app01:news_month_achive', kwargs = {'year':year, 'month':month}))
# 如果存在参数传值
#     关键字参数值 kwargs={'key':value, key1:value1}
#     位置参数 args=() 或 args=[]

app01/view

from django.shortcuts import render

# 导入HttpResponse模块
from django.http import HttpResponse
# Create your views here.
# 编写视图函数 第一个参数始终是request
# 而且一定要返回一个HttpResponse实例化对象

# 反向解析
# 导入reverse、HttpResponseRedirect模块
from django.urls import reverse
from django.http import HttpResponseRedirect

def index(request):
    return HttpResponse('index1')

def year_achive(request, year=None):
    # return HttpResponse('year '+year)
    # year_list = ['2015' ,'2016', '2017', '2018']
    month = 12
    # return render(request, 'app01/year_achive.html', {"year": year, 'year_list': year_list})
    return HttpResponseRedirect(reverse('app01:news_month_achive', kwargs = {'year':year, 'month':month}))


def news_year_achive(request, year=None):
    return render(request, 'app01/year_achive.html',{"year": year})

def month_achive(request,year=None, month=None):
    return HttpResponse('year1 '+year+' month '+month)

def article_detail(request, year=None, month=None, id=None):
    return HttpResponse('year2 '+year+' month1 '+month+' id '+id)

template/app01/year_achive.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>
<a href="{% url 'app01:news_year_achive' year=year %}">单个 反向解析URL地址:查看{{ year }}年的文章</a>
</p>
<p>
<ul>
    {% for yearvar in year_list %}
        <li><a href="{% url 'app01:news_year_achive' year=yearvar %}">循环 反向解析URL地址:查看{{ yearvar }}年的文章</a></li>
    {% endfor %}
</ul>
</p>
</body>
</html>

 

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!