python - template - is not a registered tag library. must be one of:
Opcional obtener parĂ¡metros en django? (7)
¿Alguien puede explicar cómo escribir un patrón de url y una vista que permita parámetros opcionales? Lo he hecho con éxito, pero siempre rompo la etiqueta de la plantilla url.
Esto es lo que tengo actualmente:
Modelo
(r''^so/(?P<required>/d+)/?(?P<optional>(.*))/?$'', ''myapp.so'')
Ver
def so(request, required, optional):
Si utilizo la etiqueta de la plantilla url en este ejemplo que proporciona ambos argumentos, funciona bien; sin embargo, si omito el argumento opcional, obtengo un error de reversión.
¿Cómo puedo lograr esto?
Gracias pete
Dependiendo de su caso de uso, puede simplemente querer pasar un parámetro de url así:
url/?parameter=foo
llama esto en tu opinión:
request.REQUEST.get(''parameter'')
esto devolverá ''foo''
En views.py haces algo simple.
def so(request, required, optional=None):
Y cuando no obtenga un parámetro opcional en la cadena url, será Ninguno en su código.
Sencillo y elegante :)
Generalmente hago dos patrones con una url nombrada :
url(r''^so/(?P<required>/d+)/$'', ''myapp.so'', name=''something''),
url(r''^so/(?P<required>/d+)/(?P<optional>.*)/$'', ''myapp.so'', name=''something_else''),
Las urls de Django son polimórficas:
url(r''^so/(?P<required>/d+)/$'', ''myapp.so'', name=''sample_view''),
url(r''^so/(?P<required>/d+)/(?P<optional>.*)/$'', ''myapp.so'', name=''sample_view''),
es obvio que tienes que hacer tus puntos de vista de esta manera:
def sample_view(request, required, optional = None):
así que puedes llamarlo con el mismo nombre y funcionaría correctamente. Sin embargo, tenga en cuenta que no puede pasar Ninguno como el argumento requerido y espere que lo lleve a la expresión regular sin argumento:
Incorrecto:
{% url sample_view required optional %}
Correcto:
{% if optional %}
{% url sample_view required optional %}
{% else %}
{% url sample_view required %}
{% endif %}
No sé si esto está documentado en alguna parte, lo descubrí por accidente, olvidé volver a escribir los nombres de URL y funcionó de todos modos :)
Otros han demostrado la forma de manejar esto con dos patrones de URL con nombre separados. Si la repetición de parte del patrón de URL le molesta, es posible deshacerse de él utilizando include ():
url(r''^so/(?P<required>/d+)/'', include(''myapp.required_urls''))
Y luego agregue un archivo required_urls.py con:
url(r''^$'', ''myapp.so'', name=''something'')
url(r''^(?P<optional>.+)/$'', ''myapp.so'', name=''something_else'')
Normalmente, no consideraría que esto valga la pena a menos que haya un prefijo común para un buen número de URL (sin duda más de dos).
Para cualquier persona que todavía tenga este problema. Uso Django 1.5 (actualizado: usando 1.8) y aún funciona bien.
Yo suelo:
urls.py
url(r''^(?P<app_id>/d+)/start/+(?P<server_id>/d+)?'', views.restart, name=''restart'')
Entonces cuando quiero tener las dos urls.
/1/start/2
y
/1/start
Yo suelo:
{% url ''<namespace>:start'' app.id %}
{% url ''<namespace>:start'' app.id server.id %}
Esto creará las urls.
/1/start/2 and
/1/start/ <- notice the slash.
Si crea una url manualmente, debe tener en cuenta /.
¡Aro esto ayuda a cualquiera!
Por qué no tener dos patrones:
(r''^so/(?P<required>/d+)/(?P<optional>.*)/$'', view=''myapp.so'', name=''optional''),
(r''^so/(?P<required>/d+)/$'', view=''myapp.so'', kwargs={''optional'':None}, name=''required''),