2010-06-20 13 views

risposta

23

È possibile utilizzare il metodo resolve fornito da django per ottenere la funzione. È possibile utilizzare l'attributo __module__ della funzione restituita per ottenere l'etichetta dell'app. Ciò restituirà una stringa come project.app.views. Quindi, qualcosa di simile:

from django.core.urlresolvers import resolve 

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

Sulla base di KillianDS's answer, ecco la mia soluzione:

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)) 

Ora si può chiamare return response(request) alla fine della vostra vista funcs e sarà automaticamente caricare app/view.html come modello e passare nel contesto della richiesta.

+2

dato che hai già la richiesta puoi semplicemente fare "request.resolver_match" invece di chiamare risolvere –

3

Da Django 1.3 (marzo 2011) la funzione resolve nel modulo urlresolvers restituisce un oggetto ResolverMatch. Che fornisce l'accesso a tutti gli attributi della corrispondenza dell'URL risolto, incluso il percorso della vista callable.

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