you urls template tag register forget examples did bootstrap django django-views django-urls

urls - django views



ParĂ¡metros de URL opcionales de Django (4)

Tengo una url de Django así:

url( r''^project_config/(?P<product>/w+)/(?P<project_id>/w+)/$'', ''tool.views.ProjectConfig'', name=''project_config'' ),

y mi views.py:

def ProjectConfig(request, product, project_id=None, template_name=''project.html''): ... # do stuff

El problema es que quiero que el parámetro project_id sea opcional. Me gustaría que /project_config/ y /project_config/12345abdce/ sean ambos patrones de URL igualmente válidos, para que IF project_id se pase, entonces puedo usarlo. Tal como está en este momento, obtengo un 404 si trato de acceder a la url sin el parámetro project_id .


Aún más simple es usar:

(?P<project_id>/w+|)

El "(a | b)" significa a o b, por lo que en su caso sería uno o más caracteres de palabra (/ w +) o nada.

Entonces se vería así:

url( r''^project_config/(?P<product>/w+)/(?P<project_id>/w+|)/$'', ''tool.views.ProjectConfig'', name=''project_config'' ),


Hay varios enfoques.

Una de ellas es usar una expresión de lujo ... (?:/(?P<title>[a-zA-Z]+)/)?
Haciendo un Token URL Regex Django Opcional

Otra manera, más fácil de seguir, es tener múltiples reglas que coincidan con sus necesidades, todas apuntando a la misma vista.

urlpatterns = patterns('''', url(r''^project_config/$'', views.foo), url(r''^project_config/(?P<product>/w+)/$'', views.foo), ulr(r''^project_config/(?P<product>/w+)/(?P<project_id>/w+)/$'', views.foo), )

Tenga en cuenta que en su vista también deberá establecer un valor predeterminado para el parámetro de URL opcional, o obtendrá un error:

def foo(request, optional_parameter=''''): # Your code goes here


Pensé que agregaría un poco a la respuesta.

Si tiene varias definiciones de URL, tendrá que nombrarlas por separado. Por lo tanto, pierde la flexibilidad cuando llama al reverso, ya que un reverso espera un parámetro mientras que el otro no.

Otra forma de usar regex para acomodar el parámetro opcional:

r''^project_config/(?P<product>/w+)/((?P<project_id>/w+)/)?$''


Puedes usar rutas anidadas

Django <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") ))), ))), )

Django> = 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") ])), ])), ]

Esto es mucho más SECO (Digamos que quería cambiar el nombre del product kwarg a product_id , solo tiene que cambiar la línea 4, y afectará las siguientes URL).

Editado para Django 1.8 y superior