2010-06-20 9 views

Respuesta

23

Puede usar el método resolve proporcionado por django para obtener la función. Puede usar el atributo __module__ de la función devuelta para obtener la etiqueta de la aplicación. Esto devolverá una cadena como project.app.views. Así que algo como esto:

from django.core.urlresolvers import resolve 

myfunc, myargs, mykwargs = resolve("/hello_world/") 
mymodule = myfunc.__module__ 
0

Basado en KillianDS's answer, aquí está mi solución:

from django.core.urlresolvers import resolve 

def response(request, template=None, vars={}): 
    if template is None: 
     view_func = resolve(request.META['REQUEST_URI'])[0] 
     app_label = view_func.__module__.rsplit('.', 1)[1] 
     view_name = view_func.__name__ 
     template = '%s.html' % os.path.join(app_label, view_name) 
    return render_to_response(template, vars, context_instance=RequestContext(request)) 

Ahora sólo puede llamar return response(request) al final de la vista funcs y cargará automáticamente app/view.html como la plantilla y pasar en el contexto de solicitud.

+2

dado que ya tiene la solicitud, simplemente puede hacer "request.resolver_match" en lugar de llamar a resolver –

3

Desde Django 1.3 (marzo de 2011) la función resolve en el módulo urlresolvers devuelve un objeto ResolverMatch. Que proporciona acceso a todos los atributos de la coincidencia de URL resuelta, incluida la ruta invocable de vista.

>>> from django.core.urlresolvers import resolve 
>>> match = resolve('/') 
>>> match.func 
<function apps.core.views.HomeView> 
>>> match._func_path 
'apps.core.views.HomeView' 
Cuestiones relacionadas