programing

Django 옵션 URL 파라미터

minecode 2022. 10. 21. 21:31
반응형

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_id4행만 변경하면 다음 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

반응형