2010-06-20 31 views
12

Với một số điện thoại như /home/ Tôi muốn tìm chức năng xem tương ứng với, tốt nhất là ở dạng như app.views.home hoặc chỉ <app_label>.<view_func>. Có một chức năng mà sẽ cho tôi điều này?Nhận chức năng xem từ yêu cầu uri?

Trả lời

23

Bạn có thể sử dụng phương thức resolve do django cung cấp để nhận hàm. Bạn có thể sử dụng thuộc tính __module__ của hàm được trả về để nhận nhãn ứng dụng. Điều này sẽ trả về một chuỗi như project.app.views. Vì vậy, một cái gì đó như thế này:

from django.core.urlresolvers import resolve 

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

Dựa trên KillianDS's answer, đây là giải pháp của tôi:

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

Bây giờ bạn chỉ có thể gọi return response(request) vào cuối funcs nhìn của bạn và nó sẽ tự động tải lên app/view.html như mẫu và chuyển vào ngữ cảnh yêu cầu.

+2

nếu bạn đã có yêu cầu, bạn có thể chỉ cần thực hiện "request.resolver_match" thay vì gọi điện –

3

Kể từ Django 1.3 (tháng 3 năm 2011), hàm resolve trong mô-đun urlresolvers trả về đối tượng ResolverMatch. Cung cấp quyền truy cập vào tất cả các thuộc tính của đối sánh URL được giải quyết, bao gồm cả đường dẫn có thể gọi.

>>> from django.core.urlresolvers import resolve 
>>> match = resolve('/') 
>>> match.func 
<function apps.core.views.HomeView> 
>>> match._func_path 
'apps.core.views.HomeView' 
Các vấn đề liên quan