【问题标题】:KeyError in my view context when trying to dynamically call a view in Django尝试在 Django 中动态调用视图时,我的视图上下文中出现 KeyError
【发布时间】:2020-07-05 21:39:03
【问题描述】:

我尝试使用此 url 配置在 Django 中动态调用视图:

url(r'^niveau/(?P<niveau_id>\d+)/(?P<channel>\w+)/$', views.switcher , name='vue_niveau')

然后在我的 view.py 中,我有:

def switcher(request, niveau_id, channel):
if channel == 'VueNiveau':
    return VueNiveau.as_view()(request)

它有效,因为我得到了良好的视图调用,但是当我尝试在我的 VueNiveau 上下文中获取 niveau_id 时:

class VueNiveau(generic.TemplateView):
template_name = 'cours/vue_niveau.html'
...

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    niveau = Niveau.objects.get(id=kwargs['niveau_id'])
    context['niveau'] = niveau

我收到一个 KeyError,说 niveau_id 未定义...

没有 switcher 函数,一切正常,我可以获取 url 数据等......所以在 switcher 函数的调用和 get_context_data 之间似乎发生了一些事情...... p>

有人理解这种行为吗?

【问题讨论】:

    标签: django django-views django-urls django-context


    【解决方案1】:

    您还需要将 URL 参数作为命名参数传递给视图函数:

    def switcher(request, niveau_id, channel):
        if channel == 'VueNiveau':
            return VueNiveau.as_view()(request, niveau_id=niveau_id, channel=channel)
        # …

    话虽如此,添加一个特殊的 URL 模式可能会更好:

    urlpatterns = [
        url(
            r'^niveau/(?P<niveau_id>\d+)/vueNiveau/$',
            views.VueNiveau.as_view(),
            name='vue_niveau'
        ),
        url(
            r'^niveau/(?P<niveau_id>\d+)/(?P<channel>\w+)/$',
            views.switcher,
            name='vue_niveau'
        )
    ]

    【讨论】:

    • 哇,非常感谢! :D 我不明白“添加一个特殊的 URL 模式可能会更好”吗?它不再是动态的了吗?我的目标是只为几个复杂的练习构建一个 url,这些练习需要完全不同和丰富的上下文......
    • @Nnomuas: 但如果channel == 'vueNiveau',那么该部分不是动态的。因此,您可以将其移至静态 URL 部分。
    • 是的,你是对的,我只是在做一些测试^^。下一步是让它适用于我的所有观点,而不必以这种方式精确。 :) 主要问题是如何保留 url 数据,所以再次感谢您的超快速回答;)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 2017-06-17
    • 2018-04-01
    • 2012-07-08
    相关资源
    最近更新 更多