我想根据网址加载特定视图,例如:
url(r'^channel/(?P<channel>\d+)/$', ---, name='channel_render'),
根据传入url的通道,我想加载一个特定的视图文件。我试过这样做:
def configure_view(channel):
print channel
urlpatterns = patterns('',
url(r'^channel/(?P<channel>\d+)/$', configure_view(channel), name='channel_render'),
但很明显,频道参数没有传入。有没有办法做到这一点?我能想到的唯一其他解决方案是加载管理器视图,然后从那里加载相关的视图文件。如果这是唯一的方法,如何从视图中重定向到另一个视图文件?
答案 0 :(得分:4)
你可以这样做。
#urls.py
url(r'^channel/(?P<channel>\d+)/$', switcher, name='channel_render'),
#views.py
def switcher(request, channel):
if channel == 'Whatever':
return view_for_this_channel()
def view_for_this_channel()
#handle like a regular view
如果使用基于类的视图,switcher()
中的调用将如下所示:
#views.py
def switcher(request, channel):
if channel == 'Whatever':
return ViewForThisChannel.as_view()(request) # <-- call to CBV
def ViewForThisChannel(View):
#handle like a regular class-based view
答案 1 :(得分:2)
对于重定向,您应该使用Django重定向快捷键功能:
from django.shortcuts import redirect
def my_view(request):
...
return redirect('some-view-name', foo='bar')
https://docs.djangoproject.com/en/1.7/topics/http/shortcuts/#redirect
答案 2 :(得分:0)
我认为最简单的方法是加载一个视图,该视图作为一个小型调度程序,调用您感兴趣的最终视图。
就如何做到这一点而言,视图只是以特定方式调用并期望返回特定事物的函数。你可以从另一个看到一个视图;只是确保你正确地返回结果。
您可以使用import
从不同文件加载视图。
答案 3 :(得分:0)
尝试像普通视图一样调用,例如
def configure_view(request, channel):
print channel
url(r'^channel/(?P<channel>\d+)/$', configure_view, name='channel_render'),