Django 옵션 URL 파라미터
다음과 같은 Django URL이 있습니다.
url(
r'^project_config/(?P<product>\w+)/(?P<project_id>\w+)/$',
'tool.views.ProjectConfig',
name='project_config'
),
views.py:
def ProjectConfig(request, product, project_id=None, template_name='project.html'):
...
# do stuff
문제는 내가 원하는 것은project_id
파라미터는 옵션입니다.
나는 되고 싶다./project_config/
그리고./project_config/12345abdce/
URL 패턴의 유효성을 동등하게 유지하여 project_id
통과하면 쓸 수 있어요.
현재 상태로는, 제가 URL에 접속할 때 404를 얻습니다.project_id
파라미터를 지정합니다.
몇 가지 방법이 있습니다.
하나는 regex에서 비캡처 그룹을 사용하는 것입니다.(?:/(?P<title>[a-zA-Z]+)/)?
Regex Django URL 토큰 옵션화
또 다른 더 쉽게 따를 수 있는 방법은 요구에 맞는 여러 규칙을 모두 동일한 보기를 가리키는 것입니다.
urlpatterns = patterns('',
url(r'^project_config/$', views.foo),
url(r'^project_config/(?P<product>\w+)/$', views.foo),
url(r'^project_config/(?P<product>\w+)/(?P<project_id>\w+)/$', views.foo),
)
보기에서는 옵션 URL 파라미터의 기본값도 설정해야 합니다.그렇지 않으면 다음 오류가 발생합니다.
def foo(request, optional_parameter=''):
# Your code goes here
Django > 2.0 버전:
토미타 유지의 회답과 본질적으로 같은 어프로치입니다.단, 해당 구문은 다음과 같습니다.
# URLconf
...
urlpatterns = [
path(
'project_config/<product>/',
views.get_product,
name='project_config'
),
path(
'project_config/<product>/<project_id>/',
views.get_product,
name='project_config'
),
]
# View (in views.py)
def get_product(request, product, project_id='None'):
# Output the appropriate product
...
를 사용하면 옵션 인수를 사용하여 뷰에 추가 인수를 전달할 수도 있습니다.kwargs
그것은 종류이다dict
. 이 경우 뷰에는 Atribute의 디폴트가 필요 없습니다.project_id
:
...
path(
'project_config/<product>/',
views.get_product,
kwargs={'project_id': None},
name='project_config'
),
...
최신 Django 버전에서 이 작업을 수행하는 방법에 대해서는 URL 디스패치에 대한 공식 문서를 참조하십시오.
네스트된 루트를 사용할 수 있습니다.
장고 <1.8
urlpatterns = patterns(''
url(r'^project_config/', include(patterns('',
url(r'^$', ProjectConfigView.as_view(), name="project_config")
url(r'^(?P<product>\w+)$', include(patterns('',
url(r'^$', ProductView.as_view(), name="product"),
url(r'^(?P<project_id>\w+)$', ProjectDetailView.as_view(), name="project_detail")
))),
))),
)
장고 > = 1.8
urlpatterns = [
url(r'^project_config/', include([
url(r'^$', ProjectConfigView.as_view(), name="project_config")
url(r'^(?P<product>\w+)$', include([
url(r'^$', ProductView.as_view(), name="product"),
url(r'^(?P<project_id>\w+)$', ProjectDetailView.as_view(), name="project_detail")
])),
])),
]
이것은 훨씬 더 DRY입니다(예를 들어 이름을 바꾸고 싶다고 합니다).product
에 경고하다.product_id
4행만 변경하면 다음 URL에 영향을 줍니다.
장고 1.8 이상 편집
더 간단한 방법은 다음과 같습니다.
(?P<project_id>\w+|)
"(a|b)"는 a 또는 b를 의미하기 때문에 이 경우 1개 이상의 단어 문자(\w+) 또는 0이 됩니다.
예를 들어 다음과 같습니다.
url(
r'^project_config/(?P<product>\w+)/(?P<project_id>\w+|)/$',
'tool.views.ProjectConfig',
name='project_config'
),
대답에 조금 더 보태야겠다고 생각했어요.
URL 정의가 여러 개 있는 경우 각각의 이름을 개별적으로 지정해야 합니다.따라서 리버스 호출 시 한쪽 리버스에서는 파라미터가 요구되고 다른 한쪽 리버스에서는 파라미터가 요구되지 않기 때문에 유연성이 상실됩니다.
옵션 파라미터를 수용하기 위해 regex를 사용하는 다른 방법:
r'^project_config/(?P<product>\w+)/((?P<project_id>\w+)/)?$'
장고 = 2.2
urlpatterns = [
re_path(r'^project_config/(?:(?P<product>\w+)/(?:(?P<project_id>\w+)/)/)?$', tool.views.ProjectConfig, name='project_config')
]
사용? 잘 작동하면 pythex를 확인할 수 있습니다.뷰 메서드의 정의에 파라미터 *args 및 **kwargs를 추가해야 합니다.
url('project_config/(?P<product>\w+)?(/(?P<project_id>\w+/)?)?', tool.views.ProjectConfig, name='project_config')
언급URL : https://stackoverflow.com/questions/14351048/django-optional-url-parameters
'programing' 카테고리의 다른 글
Objective-C에서의 선언 및 체크/비교(비트마스크-) Enum (0) | 2022.10.21 |
---|---|
#1064 - SQL 구문에 오류가 있습니다.MariaDB 서버 버전에 대응하는 매뉴얼에서 사용하는 올바른 구문을 확인해 주십시오.근접적인 이유는 무엇입니까? (0) | 2022.10.21 |
PHP 오류를 표시하려면 어떻게 해야 하나요? (0) | 2022.10.21 |
x일 연속 값이 동일한지 확인합니다. (0) | 2022.10.21 |
https://bower.herokuapp.com/packages/에 대한 EINVRES 요구가 502로 실패했습니다. (0) | 2022.10.21 |