Django - 网址的动态视图

时间:2011-05-20 14:50:39

标签: django django-urls

我想根据网址加载特定视图,例如:

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

但很明显,频道参数没有传入。有没有办法做到这一点?我能想到的唯一其他解决方案是加载管理器视图,然后从那里加载相关的视图文件。如果这是唯一的方法,如何从视图中重定向到另一个视图文件?

4 个答案:

答案 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'),