我在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中进行这种路由? 非常感谢,詹姆斯
答案 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/')