Tengo una URL de Django como esta:
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
El problema es que quiero que el project_id
parámetro sea opcional.
Quiero /project_config/
y /project_config/12345abdce/
para ser patrones de URL igualmente válidas, de manera que si project_id
se pasa, a continuación, lo puedo usar.
Tal como está en este momento, obtengo un 404 cuando accedo a la URL sin el project_id
parámetro.
fuente
Puedes usar rutas anidadas
Django <1.8
Django> = 1.8
Esto es mucho más SECO (supongamos que desea cambiar el nombre de
product
kwarg aproduct_id
, solo tiene que cambiar la línea 4, y afectará las siguientes URL.Editado para Django 1.8 y superior
fuente
Aún más simple es usar:
El "(a | b)" significa aob, por lo que en su caso sería uno o más caracteres de palabras (\ w +) o nada.
Entonces se vería así:
fuente
None
. Esto significa que no puede confiar en un valor predeterminado en la firma de la vista para esto: debe probarlo explícitamente en su interior y asignarlo en consecuencia.Django> versión 2.0 :
El enfoque es esencialmente idéntico al dado en la respuesta de Yuji 'Tomita' Tomita . Sin embargo, se ve afectada la sintaxis:
El uso
path()
también puede pasar argumentos adicionales a una vista con el argumento opcionalkwargs
que es de tipodict
. En este caso, su vista no necesitaría un valor predeterminado para el atributoproject_id
:Para saber cómo se hace esto en la versión más reciente de Django , consulte los documentos oficiales sobre el envío de URL .
fuente
project_id
quieto en el camino en caso de que se usara por defectodict
. Esto puede conducir a un comportamiento aparentemente extraño, ya que el argumento proporcionado en eldict
siempre se utilizará (si no recuerdo mal).Pensé que agregaría un poco a la respuesta.
Si tiene varias definiciones de URL, deberá nombrar cada una de ellas por separado. Por lo tanto, pierde la flexibilidad al llamar al reverso, ya que un reverso esperará un parámetro mientras que el otro no.
Otra forma de usar regex para acomodar el parámetro opcional:
fuente
Reverse for 'edit_too_late' with arguments '()' and keyword arguments '{'pk': 128}' not found. 1 pattern(s) tried: ['orders/cannot_edit/((?P<pk>\\d+)/)?$']
Django = 2.2
fuente
Utilizar ? funciona bien, puedes comprobar en pythex . Recuerde agregar los parámetros * args y ** kwargs en la definición de los métodos de vista
fuente