首页 > 解决方案 > 不要设法对 Django 的 url 使用动态视图

问题描述

我正在尝试动态调用 url 的视图。让我准确地说。我想创建一些对象,实际上是“练习”,每个对象都需要一个视图(因为有大量的变量,这会因练习而异)。我为每个练习使用了一个 TemplateView。实际上,每个人也需要一个不同的htlm,但是这个可以在视图中给出。

我尝试了这里找到的方法:url 的动态

下面是我们感兴趣的代码:我精确地指出,Exercise 类的每个练习(在 models.py 中)都至少有一个名为 Wanted_view 的属性,它指示练习的所需视图。

example.html(其中包含一个练习的链接):

{% for exercise in list_exercise %}
... 
<a href="{% url 'vue_exercise' exercise.id exercise.wanted_view %}"> The link to the wanted exercise </a>
...
{% endfor %}
其中list_exercise 是example.html 的上下文变量,其中包含Exercise 类的所有对象。

urls.py:

...
from . import views
urlpatterns = [
    url(r'^exercise/(?P<exercise_id>\d+)/(?P<channel>\w+)/$', views.switcher, name='vue_exercise'),
]

这里是一个动态 url,它等待着 exercise_id(这里是 exercise.id)和频道(这里是 exercise.wanted_view)。

视图.py:

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

class TheFamousWantedView(generic.TemplateView):
    template_name = 'wanted_template.html'
    context_object_name = ...

    def get_context_data(self, **kwargs):
        exercise = Exercise.objects.get(id=kwargs['exercise_id'])
        context = super().get_context_data(**kwargs)
        context['exercise'] = exercise
        return context

在这里,我们构建了练习的视图,它带回了练习的 id,以便能够显示与该练习相关的一些特定信息。

我遇到的问题是切换器功能必须调用好的视图。我有这个错误:

switcher() 得到了一个意外的关键字参数“exercise_id”

此外,我是否能够制作一个类似于切换器的功能,为此我不必为每个视图创建 IF 条件,就像上面的“if channel == 'TheFamousWantedView' ...)?

解决方案1:我以这种方式修改了我的功能

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

现在调用了 TheFamousWantedView,这很酷,但还有另一个问题。kwargs 字典似乎已被清空,现在出现了一个 KeyError,它告诉我,executive_id 是未知的......在我定义该切换器功能之前,它工作得很好。

任何想法 ??

标签: djangodjango-viewsdjango-templatesdjango-urlskeyerror

解决方案


def switcher(request, channel):

此函数仅从您的 url 接收一个参数channel,该参数exercise_id未正确接收。无论如何,即使您不打算对它做任何事情,您也必须处理它。

def switcher(request, exercise_id, channel):

对于“此外”,我认为您可以使用这些渠道创建一个模型,并为类似于template_name. 然后在您的函数中调用模板后获得正确的通道。


推荐阅读