【问题标题】:Is it possible to route to a particular view based on URL variables passed?是否可以根据传递的 URL 变量路由到特定视图?
【发布时间】:2011-05-24 10:09:10
【问题描述】:

我正在 Django 中进行某种复杂的路由。我有一组应用程序,其中哪个视图取决于传递的 URL 变量。

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

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

例如:

http://127.0.0.1:8000/james-morris/wedding/ --- 这将转到“james-morris”的个人资料和模块“婚礼”,这恰好是一个任务列表,需要转到任务视图

http://127.0.0.1:8000/james-morris/icons/ --- 这将转到“james-morris”的配置文件和模块“icons”,它恰好是一个媒体列表,需要转到媒体视图

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 这在这个意义上是行不通的,因为“婚礼”或“图标”完全取决于用户。所以我不知道事先在网址中设置它是“婚礼”还是“图标”。非常感谢您的回复:)
    • @littlejim84:在这种情况下,您需要创建一个函数来自己路由视图。您可以简单地创建一个函数来返回对另一个视图的调用。
    • 在这种特殊情况下,这个解决方案对我来说效果很好。非常感谢。
    【解决方案2】:

    是否可以根据传递的 URL 变量路由到特定视图?
    执行路由的最简洁方法是遵守基本的 REST 规则 - 每个资源一个 URL。因此,最好的办法是根据 URL 进入视图,然后您可以创建一个 if..elif..else.. 块来检查传递的各种变量和相应地路由到不同的视图。

    至于您提到的示例,如果您在 urls.py 中没有针对相同的视图,Django 应该将您路由到不同的视图

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-01
        • 1970-01-01
        • 2013-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多