2010-06-20 6 views
12

Gegeben ein uri wie /home/ Ich möchte die Ansicht Funktion finden, der das entspricht, vorzugsweise in einer Form wie app.views.home oder nur <app_label>.<view_func>. Gibt es eine Funktion, die mir das gibt?Ansicht Funktion von Anfrage Uri?

Antwort

23

Sie können die von django zur Verfügung gestellte Methode resolve verwenden, um die Funktion zu erhalten. Sie können das Attribut __module__ der zurückgegebenen Funktion verwenden, um die App-Bezeichnung abzurufen. Dies wird eine Zeichenfolge wie project.app.views zurückgeben. So etwas wie folgt aus:

from django.core.urlresolvers import resolve 

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

Basierend auf KillianDS's answer, hier ist meine Lösung:

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

Jetzt können Sie nur return response(request) rufen am Ende Ihrer Ansicht funcs und es wird automatisch app/view.html als Vorlage laden und den Anforderungskontext übergeben.

+2

vorausgesetzt, dass Sie bereits die Anfrage haben, können Sie einfach "request.resolver_match" statt aufrufen lösen zu tun –

3

Seit Django 1.3 (März 2011) die resolve Funktion in der urlresolvers Modul ein ResolverMatch Objekt zurückgibt. Dies bietet Zugriff auf alle Attribute der aufgelösten URL-Übereinstimmung, einschließlich des aufrufbaren Pfads der Ansicht.

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