Pregunta

¿Hay alguna manera de pasar un parámetro predeterminado a una acción en el caso de que la expresión regular no coincida con django?


urlpatterns = patterns('',(r'^test/(?P<name>.*)?

He intentado establecer el tercer parámetro en los patrones de URL en un diccionario que contiene 'y le he dado al parámetro de nombre un valor predeterminado en el método, ninguno de los cuales funcionó. el parámetro de nombre siempre parece ser Ninguno. Realmente no deseo codificar un cheque para Ninguno si puedo establecer un valor predeterminado.

Aclaración: aquí hay un ejemplo de cómo lo estaba cambiando.


def displayName(request,name='Steve'):
      return HttpResponse(name)
#i also tried

urlpatterns = patterns('',
      (r'^test/(?P<name>.*)?

cuando apunto mi navegador a la vista, muestra el texto "Ninguno"

¿Alguna idea?

,'myview.displayName')) #myview.py def displayName(request,name): # write name to response or something

He intentado establecer el tercer parámetro en los patrones de URL en un diccionario que contiene 'y le he dado al parámetro de nombre un valor predeterminado en el método, ninguno de los cuales funcionó. el parámetro de nombre siempre parece ser Ninguno. Realmente no deseo codificar un cheque para Ninguno si puedo establecer un valor predeterminado.

Aclaración: aquí hay un ejemplo de cómo lo estaba cambiando.

<*>

cuando apunto mi navegador a la vista, muestra el texto "Ninguno"

¿Alguna idea?

, 'myview.displayName', dict(name='Test') ) )

cuando apunto mi navegador a la vista, muestra el texto "Ninguno"

¿Alguna idea?

,'myview.displayName')) #myview.py def displayName(request,name): # write name to response or something

He intentado establecer el tercer parámetro en los patrones de URL en un diccionario que contiene 'y le he dado al parámetro de nombre un valor predeterminado en el método, ninguno de los cuales funcionó. el parámetro de nombre siempre parece ser Ninguno. Realmente no deseo codificar un cheque para Ninguno si puedo establecer un valor predeterminado.

Aclaración: aquí hay un ejemplo de cómo lo estaba cambiando.

<*>

cuando apunto mi navegador a la vista, muestra el texto "Ninguno"

¿Alguna idea?

¿Fue útil?

Solución

El problema es que cuando el patrón se compara con 'test /', el código de grupo capturado por la expresión regular contiene el mapeo 'nombre' = > Ninguna:

>>> url.match("test/").groupdict()
{'name': None}

Esto significa que cuando se invoca la vista, usando algo que espero que sea similar al siguiente:

view(request, *groups, **groupdict)

que es equivalente a:

view(request, name = None)

para 'prueba /', lo que significa que el nombre tiene asignado Ninguno en lugar de no asignado.

Esto te deja con dos opciones. Usted puede:

  1. Verifique explícitamente que no haya ninguno en el código de vista, que es un poco pirateado.
  2. Reescriba la regla de envío de URL para que la captura de nombre no sea opcional e introduzca una segunda regla para capturar cuando no se proporcione ningún nombre.

Por ejemplo:

urlpatterns = patterns('',
    (r'^test/(?P<name>.+)

Al adoptar el segundo enfoque, puede simplemente llamar al método sin el patrón de captura, y dejar que Python maneje el parámetro predeterminado o puede llamar a una vista diferente que delegue.

,'myview.displayName'), # note the '+' instead of the '*' (r'^test/

Al adoptar el segundo enfoque, puede simplemente llamar al método sin el patrón de captura, y dejar que Python maneje el parámetro predeterminado o puede llamar a una vista diferente que delegue.

,'myview.displayName'), )

Al adoptar el segundo enfoque, puede simplemente llamar al método sin el patrón de captura, y dejar que Python maneje el parámetro predeterminado o puede llamar a una vista diferente que delegue.

Otros consejos

Yo pensé que podría def displayName (request, name = defaultObj) ; eso es lo que he hecho en el pasado, al menos. ¿En qué estabas configurando el valor predeterminado?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top