是否可以根据传递的URL变量路由到特定视图?

时间:2010-12-13 00:29:10

标签: django url django-models django-views django-urls

我在Django中做了一些复杂的路由。我有一组应用程序,其中视图将取决于传递哪些URL变量。

例如,在我的URL中,我有一个配置文件slug和一个模块slug。如果记录的用户具有权限,他们将根据URL中的配置文件slug查看哪个配置文件。如果他们有权限,他们将看到哪个模块取决于URL中的模块slug以及它是否是所选配置文件的子项。

模块基本上是不同的应用程序。其中一个模块是任务列表,另一个是媒体列表等。因为用户可以有多个任务模块或多个媒体模块,每个都有自己的slug,我需要一种路由到任务或媒体视图的方式,具体取决于什么网址是。

例如:

http://127.0.0.1:8000/james-morris/wedding/ ---这将转到'james-morris'的模板和'wedding'模块,它恰好是一个任务列表,需要进入任务视图

http://127.0.0.1:8000/james-morris/icons/ ---这将转到'james-morris'的模板和模板'icons',它恰好是媒体列表,需要进入媒体视图

我如何在Django中进行这种路由? 非常感谢,詹姆斯

3 个答案:

答案 0 :(得分:2)

也许我错了,但我相信像这样的事情已经做到了。

def redirect(request, username, module):
    '''do some stuff here...'''
    if username.has_icons():
        return show_icon(request, username)
    #elif ... something else...

urlpatterns = patterns('',
    (r'^(?P<username>\w+)/(?P<module>\w+)/$', redirect),
)

答案 1 :(得分:1)

是否可以根据传递的URL变量路由到特定视图?
执行路由的最简洁方法是遵循基本的 REST 规则 - 每个资源一个URL。所以,最好的办法是在URL的基础上登陆视图然后你可以创建一个 if..elif..else .. 块来检查传递的各种变量和相应地路由不同的观点。

至于您提到的示例,如果您没有在urls.py中定位相同的视图,Django应该将您转到不同的视图

答案 2 :(得分:0)

作为Sidharth Sharma解决方案的变体,如果您需要检查权限,那么另一个选择是让应用程序专门用于重新路由。此应用程序中的视图然后执行HttpResponseRedirect到特定于您想要的应用程序的URL。

urlpatterns = patterns('',
    (r'^(?P<username>\w+)/?P<option>/$', 'reroute.views.direct'),
    (r'^(?P<username>\w+)/wedding/$', 'wedding.views.tasks'),
    (r'^(?P<username>\w+)/icons/$', 'icons.views.media'),
)

def direct(request, username, option):

   if has_condition_for_wedding:
       HttpResponseRedirect('/username/wedding/')
   else:
       HttpResponseRedirect('/username/icons/')