【问题标题】:Django - Dynamic view for urlDjango - url 的动态视图
【发布时间】:2011-05-20 14:50:39
【问题描述】:

我想根据 url 加载特定的视图,例如:

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

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

【问题讨论】:

    标签: django django-urls


    【解决方案1】:

    你可以这样做。

    #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
    

    【讨论】:

      【解决方案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

      【讨论】:

        【解决方案3】:

        我认为最简单的方法是加载一个充当微型调度程序的视图,该调度程序调用您感兴趣的最终视图。

        就如何做到这一点而言,视图只是以特定方式调用并期望返回特定事物的函数。您可以从另一个视图调用一个视图;只需确保您正确返回结果即可。

        您可以使用import 从不同文件加载视图。

        【讨论】:

        • 我宁愿以与解析 URL 时 django 相同的方式加载视图,只是冷导入视图似乎不正确?我去看看源代码,看看 django 是如何导入视图的,也许有一个我可以劫持的函数。
        • 看来我可以使用 django.utils.importlib 中的 import_module。谢谢。
        【解决方案4】:

        尝试像普通视图一样调用,例如

        def configure_view(request, channel):
            print channel
        
        url(r'^channel/(?P<channel>\d+)/$', configure_view, name='channel_render'),
        

        【讨论】:

          猜你喜欢
          • 2020-10-22
          • 2012-08-05
          • 1970-01-01
          • 1970-01-01
          • 2021-07-26
          • 2012-07-28
          • 1970-01-01
          • 1970-01-01
          • 2015-03-29
          相关资源
          最近更新 更多