English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Django URL 매핑

이전 장에서 설명한 작업 뷰가 있습니다. 이 뷰에 URL을 통해 접근하려고 합니다. Django는 자신의 URL 매핑 방식을 가지고 있으며, 이제 프로젝트의 url.py 파일을 편집하겠습니다(myproject/url.py) 완료. url.py 파일의 내용은 다음과 같습니다:

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
from django.conf.urls import patterns, include, url
 django.contrib를 가져오기
 admin.autodiscover()
 urlpatterns = patterns('',
    #Examples
    #url(r'^, 'myproject.view.home', name = 'home'),
    #url(r'^blog/', include('blog.urls')),
    url(r'^admin', include(admin.site.urls)),
 ) , 'myproject.view.home', name = 'home'),
    #url(r'^blog/', include('blog.urls')),
    url(r'^admin', include(admin.site.urls)),
 )

사용자가 네트워크 애플리케이션에서 웹 페이지 요청을发起하면, Django 컨트롤러가 url.py 파일을 통해 해당 뷰를 찾아 HTML 응답을 반환하거나, 찾지 못하면 반환합니다404오류를 찾지 못했습니다. 가장 중요한 것은 'urlpatterns' 튜플입니다. 이는 URL과 뷰 간의 매핑을 정의합니다. 매핑된 URL 패턴은 튜플처럼 보입니다 -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
from django.conf.urls import patterns, include, url
 django.contrib를 가져오기
 admin.autodiscover()
 urlpatterns = patterns('',
    #Examples
    #url(r'^, 'myproject.view.home', name = 'home'),
    #url(r'^blog/', include('blog.urls')),
    url(r'^admin', include(admin.site.urls)),
    url(r'^hello/', 'myapp.views.hello', name = 'hello'),
 ) , 'myproject.view.home', name = 'home'),
    #url(r'^blog/', include('blog.urls')),
    url(r'^admin', include(admin.site.urls)),
    url(r'^hello/', 'myapp.views.hello', name = 'hello'),
 )

URL 표시 줄 매핑 URL "/"home"을 "myapp"로/ view.py 파일에서 생성된 Hello 뷰. 위의 매핑은 세 가지 요소로 구성되어 있습니다 -

패턴-URL을 해석하고 매핑하는 정규 표현식. python 're' 모듈과 함께 작동하는 모든 패턴(URL을 통해 매개변수를 전달하려고 할 때 매우 유용합니다). python으로 뷰의 경로-모듈을 가져오는 때와 같은 경로. 이름-URL 반전을 수행하려면 URL 패턴의 이름을 사용해야 합니다. 이렇게 하면 서버를 시작하고 다음 URL을 통해 뷰에 접근할 수 있습니다: http://127.0.0.1/hello

URL 정리

현재까지 'myprojects'를 생성했습니다/url.py 파일의 URL을 사용하여 각应用程序의 'url.py'를 생성하는 것이 좋습니다. 이렇게 하면 다른 프로젝트에서도 재사용할 수 있으며, 문제를 쉽게 파악할 수 있습니다. 또한, 'projecturl.py' 파일에 모든 URL을 저장하려면 이렇게 해야 합니다. 따라서, 각应用程序의 'url.py'를 생성하고, 주 프로젝트의 url.py 파일에 포함하여 관리 인터페이스에서 URL을 관리하는 것이 좋습니다.

그렇다면 어떻게 합니까?

myapp 폴더에 urls.py 파일을 생성하기 위해 다음 코드를 사용해야 합니다(myapp/urls.py) −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
from django.conf.urls import patterns, include, url
 urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name='hello'),)

myproject/urls.py는 다음과 같이 변경됩니다-

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
from django.conf.urls import patterns, include, url
 django.contrib를 가져오기
 admin.autodiscover()
 urlpatterns = patterns('',
    #Examples
    #url(r'^, 'myproject.view.home', name = 'home'),
    #url(r'^blog/', include('blog.urls')),
    url(r'^admin', include(admin.site.urls)),
    url(r'^myapp/', include(myapp.urls)),
 ) , 'myproject.view.home', name = 'home'),
    #url(r'^blog/', include('blog.urls')),
    url(r'^admin', include(admin.site.urls)),
    url(r'^myapp/', include(myapp.urls)),
 )

우리는 myapp 애플리케이션의 모든 URL을 포함했습니다. 이는 home.html을 통해 “/hello”는 지금은 “/myapp/hello”는 웹 애플리케이션의 더 나은이자 이해하기 쉬운 구조입니다.

또 하나의 뷰 파일을 생성해 보겠습니다: C:\myproject\templates\myapp\hello.html, 그 내용은 다음과 같습니다:

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
<html>
 <head>
   <meta http-equiv="content-type="text/html; charset=utf-8>
   <title>Hello </title>
   <meta name="robots" content="NONE,NOARCHIVE">
   </style>
 </head>
     <body>
         <h2>Welcome to w3codebox .</h2>
         <p>This is my first Django App</p>
     <body>
 </html>

이제 myapp의 'morning'의 다른 뷰를 상상해 보겠습니다. 이 뷰가 myapp에 맵핑되기를 원합니다./url.py에서 우리는 myapp를 변경할 것입니다./url.py를 −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
from django.conf.urls import patterns, include, url
 urlpatterns = patterns('',
    url(r'^hello/', 'myapp.views.hello', name = 'hello'),
    url(r'^morning/', 'myapp.views.morning', name = 'morning'),
 )

이것은 다음과 같이 다시 구조화될 수 있습니다.

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
from django.conf.urls import patterns, include, url
 urlpatterns = patterns('myapp.views',
    url(r'^hello/', 'hello', name = 'hello'),
    url(r'^morning/', 'morning', name = 'morning'),)

너가 보는 것처럼, 지금 우리는 urlpatterns 튜플의 첫 번째 요소를 사용하고 있습니다. 프로그램 이름을 변경하려고 할 때 매우 유용합니다.

发送参数到视图

现在我们知道如何映射 URL,如何组织他们,现在就让我们来看看如何将参数传递给视图。一个经典的文章实例(您要访问文章到/articles/article_id())。

传递参数是通过 URL 模式正则表达式捕捉它们完成的。如果我们有类似以下的视图/view.py

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
from django.shortcuts import render
 from django.http import HttpResponse
 def hello(request):
    return render(request, "hello.html", {})
 def viewArticle(request, articleId):
    text = "Displaying article Number: %s"%articleId
    return HttpResponse(text)

我们想把它映射放在 myapp/urls.py,所以我们可以通过/myapp/article/articleId 访问,我们需要在下列/urls.py 定义−

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
from django.conf.urls import url
 from . import views
 urlpatterns = [
     url(r'^hello', views.hello, name='hello'),
     url(r'^article/(\d+)/', views.viewArticle, name='article'), 
     url(r'^', views.index, name='index'),
 ], views.index, name='index'),
 ]


当 Django 会看到 URL:/myapp/article/42”,它将传递参数42到 viewArticle 视图,在浏览器中,应该得到以下结果 -

注意,参数的顺序这里是很重要的。假设我们希望查看一年中某个一个月的文章列表,现在添加一个 viewArticles 视图。 view.py 代码变为 -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
from django.shortcuts import render
 from django.http import HttpResponse
 def hello(request):
    return render(request, "hello.html", {})
 def viewArticle(request, articleId):
    text = "Displaying article Number: %s"%articleId
    return HttpResponse(text)
 def viewArticles(request, month, year):
    text = "Displaying articles of: %s"/%s"%(year, month)
    return HttpResponse(text)

相应的 myapp/urls.py 파일은 다음과 같이 보입니다 −

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
from django.conf.urls import patterns, include, url
 urlpatterns = patterns('myapp.views',
    url(r'^hello/', 'hello', name = 'hello'),
    url(r'^morning/', 'morning', name = 'morning'),
    url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
    url(r'^articles/(\d{2)/(\d{4})', 'viewArticles', name = 'articles'),)

이제, 당신이 http:을 방문하면//localhost:8000/myapp/articles/12/2015/Displaying articles of: 2015/12하지만 파라미터를 변환하면 같은 결과를 얻을 수 없습니다.

이 경우를 피하기 위해, 가능한 한 URL 파라미터가 뷰 파라미터로 연결될 수 있습니다. 따라서 url.py는 다음과 같이 될 것입니다 -

# Filename : example.py
# Copyright : 2020 By w3codebox
# Author by : ko.oldtoolbag.com
# Date : 2020-08-08
from django.conf.urls import patterns, include, url
 urlpatterns = patterns('myapp.views',
    url(r'^hello/', 'hello', name = 'hello'),
    url(r'^morning/', 'morning', name = 'morning'),
    url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
    url(r'^articles/(?P\d{2)/(?P\d{4})', 'viewArticles', name = 'articles'),)