2011-03-31 18 views
15

En mi aplicación Django, tengo una URL Me gustaría coincidir con el que se ve un poco como esto: '?'¿Cómo puedo unir el carácter del signo de interrogación en una URL de Django?

/mydjangoapp/?parameter1=hello&parameter2=world 

El problema aquí es la carácter siendo un carácter regex reservado.

me han tratado de varias maneras para que coincida con esto ... Este fue mi primer intento:

(r'^pbanalytics/log/\?parameter1=(?P<parameter1>[\w0-9-]+)&parameter2=(?P<parameter2>[\w0-9-]+), 'mydjangoapp.myFunction') 

Este fue mi segundo intento:

(r'^pbanalytics/log/\\?parameter1=(?P<parameter1>[\w0-9-]+)&parameter2=(?P<parameter2>[\w0-9-]+), 'mydjangoapp.myFunction') 

pero aún ninguna suerte!

¿Alguien sabe cómo podría coincidir con un '?' exactamente en una URL de Django?

+0

Su primer intento se ve bien. –

+0

Gracias Bradley ... Lo intentaré de nuevo, ¡tal vez me equivoqué con algo más! –

+1

IIRC, el asignador de URL elimina la cadena de consulta antes de la coincidencia, por lo que una expresión regular con una 'r '\?'' En ella no coincidirá. Además, este enfoque es malo ya que, incluso si funcionó, no solo requiere ambos parámetros sino que también fuerza el orden de los parámetros. Es mejor usar 'request.GET'. –

Respuesta

32

No lo haga. No debe coincidir la cadena de consulta con el Despachador de URL. Puede acceder a todos los valores usando el diccionario request.GET.

URLs

(r'^pbanalytics/log/$', 'mydjangoapp.myFunction') 

función

def myFunction(request) 
    param1 = request.GET.get('param1') 
+1

Podría querer un '$' al final de la expresión regular, a menos que desee hacer coincidir todo en el directorio "pbanalytics/log /". Además, IIRC, 'request.GET.get()' toma un segundo parámetro que es el valor predeterminado si la clave no está en la solicitud. –

+0

Ahhhh ..... Entiendo. En realidad, esta sería una manera mucho más agradable de manejar los parámetros de mis URL, en lugar de tener enormes expresiones regulares en el despachador de URL. Gracias a ti y a todos los demás que publicaron comentarios y respuestas. –

+0

@Mike - Sí, ¡una buena idea! N –

1

El carácter ? es un símbolo reservado en Regex, sí. Tu primer intento parece escapar de él.

Sin embargo, ? in a URL es también el final de la ruta dey el comienzo de la parte consulta (como esto:.. protocol://host/path/?query#hash Django's URL dispatcher no le permite despacha URL basado en la parte de consulta, que yo sepa

Mi sugerencia sería escribir una vista de Django que hace el envío basado en el parámetro request.GET a su función de vista.

2

patrones de URL de Django solamente coinciden con el componente de ruta de una URL. Usted está tratando de igualar en la cadena de consulta también, esta es la razón por la que estás teniendo problemas. Su primera expresión regular hace lo que quería, excepto que solo debería coincidir con el componente ruta.

En su vista en la que se puede acceder a través de la cadena de consulta request.GET

1

La manera de hacer lo que la pregunta original, es decir, se cajón de sastre en el URL de despacho var ...

url(r'^mens/(?P<pl_slug>.+)/$', 'main.views.mens',), 

o

url(r'^mens/(?P<pl_slug>\?+)/$', 'main.views.mens',), 

En cuanto a por qué es necesario, las URL OBTENER no proporcionan exactamente buenos "enlaces permanentes" o una buena presentación en general para clientes y clientes.

Los clientes a menudo solicitan que el url se formatee, es decir

www.example-clothing-site.com/mens/tops/shirts/t-shirts/Big_Brown_Shirt3XL 

esta es una interfaz mucho más legible para el usuario final y proporciona una mejor presentación general para el cliente.

Cuestiones relacionadas