我想使用相同的模板来显示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没有太多经验,所以我不知道如何实现这个目标,我正在接受帮助。
答案 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明显分开。