2

我想使用相同的模板在 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'
),

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

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

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

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

我在 django 和 Python 方面没有太多经验,所以我不确定如何做到这一点,我正在接受帮助。

4

2 回答 2

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.

于 2012-08-03T22:06:56.743 回答
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

事实上,我总是创建自己的子类,即使不需要任何额外的功能;这样我就有了更多的控制权,并且视图和 urlconfigs 清楚地分开了。

于 2012-07-21T21:27:19.717 回答