Учитывая uri как /home/
, я хочу найти функцию представления, которой это соответствует, предпочтительно в форме, подобной app.views.home
или просто <app_label>.<view_func>
. Есть ли функция, которая даст мне это?
Получить функцию просмотра по запросу uri?
Ответ 1
Вы можете использовать метод resolve, предоставляемый django для получения функции. Вы можете использовать атрибут __module__
возвращаемой функции, чтобы получить метку приложения. Это вернет строку типа project.app.views
. Так что-то вроде этого:
from django.core.urlresolvers import resolve
myfunc, myargs, mykwargs = resolve("/hello_world/")
mymodule = myfunc.__module__
Ответ 2
Так как Django 1.3 (март 2011 г.) функция resolve
в модуле urlresolvers
возвращает объект ResolverMatch
. Это обеспечивает доступ ко всем атрибутам разрешенного URL-адреса, включая путь, вызываемый вызовом.
>>> from django.core.urlresolvers import resolve
>>> match = resolve('/')
>>> match.func
<function apps.core.views.HomeView>
>>> match._func_path
'apps.core.views.HomeView'
Ответ 3
На основе ответа KillianDS, здесь мое решение:
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))
Теперь вы можете просто вызвать return response(request)
в конце вашего представления funcs, и он будет автоматически загружать app/view.html
в качестве шаблона и проходить в контексте запроса.
Ответ 4
Начиная с Django 2.0 модуль django.core.urlresolvers
был перенесен в django.urls
.
Вам нужно будет сделать это:
from django.urls import resolve
myfunc, myargs, mykwargs = resolve("/hello_world/")
mymodule = myfunc.__module__