django:使用通用视图类将额外参数传递给模板

时间:2012-07-21 01:21:25

标签: django django-class-based-views

我想使用相同的模板来显示django中不同模型的记录,以及通用类查看器。泛型类查看器已经接受了模板中所需的大多数参数,除了一个。

如何在上下文中将此额外参数传递给模板?

我已尝试将其作为urlconf中的第三个(额外)参数传递,但未成功:

# in urlconf.py
url(r'^processador/(?P<pk>[\w-]+)/$',
    UpdateView.as_view(
        model=Processador,
        template_name='model_form.html',
        success_url=reverse_lazy('processador-list'),
        ),
    {'extrainfo': "Processador"},
    name='processador-detail'
),

url(r'^software/(?P<pk>[\w-]+)/$',
    UpdateView.as_view(
        model=Software,
        template_name='model_form.html',
        success_url=reverse_lazy('software-list'),
        ),
    {'extrainfo': "Software"},
    name='software-detail'
),

在我的应用程序中会有几个这样的urlconf。

一种可能性是对视图类进行子类化,并提供我自己的get_context_data方法实现,该方法添加了所需的键值对。

但是这个解决方案过于重复,因为它将应用于视图类的每次使用。

也许只能创建一个视图类的子类。这个新类中的as_view类方法将接受一个新的命名参数,该参数将在get_context_data的重新定义中进入上下文。

我对django和Python没有太多经验,所以我不知道如何实现这个目标,我正在接受帮助。

2 个答案:

答案 0 :(得分:4)

我认为你只能使用UpdateView的一个子类,而不是我认为你需要的每个模型的子类。

as_view的参数被设置为返回的对象的属性,所以我认为你可以做到

class MyUpdateView(UpdateView):
    extrainfo = None

    def get_context_data(self, **kwargs):
        context = super(MyUpdateView, self).get_context_data(self, **kwargs)
        context['extrainfo'] = self.extrainfo

        return context

然后在你的urlconf中调用它,如

url(r'^processador/(?P<pk>[\w-]+)/$',
    MyUpdateView.as_view(
        model=Processador,
        template_name='model_form.html',
        success_url=reverse_lazy('processador-list'),
        extrainfo="Processador"
        ),
    name='processador-detail'
)

我完全不确定你应该这样做 - 它正朝着urls.py中的太多东西前进。

答案 1 :(得分:2)

我一直在通过子类化通用视图来完成它,如下所示:

urls.py

url(r'^processador/(?P<pk>[\w-]+)/$', ProcessadorUpdateView.as_view(), name='processador-detail'),
url(r'^software/(?P<pk>[\w-]+)/$', SoftwareUpdateView.as_view(), name='software-detail'),

views.py

class ProcessadorUpdateView(UpdateView):
    model=Processador
    template_name='model_form.html'
    success_url=reverse_lazy('processador-list') # I'm not sure this will work; I've used get_success_url method
    def get_context_data(self, **context):
        context[self.context_object_name] = self.object
        context["extrainfo"] = "Processador"
        return context

事实上,即使不需要任何额外的功能,我总是创建自己的子类;通过这种方式,我可以更好地控制,并且视图和urlconfig明显分开。