django - DetailView 如何同时显示两个模型

6 投票
2 回答
4532 浏览
提问于 2025-04-17 16:15

我有两个模型:广告(Advertisment)和横幅(Banner)。

当我使用“通用视图”(generic view)中的详细视图(DetailView)时,怎样才能同时获取这两个模型的数据呢?下面的代码只获取了一个广告(Advertisment)。

这是我的 url.py 文件。

url(r'^(?P<pk>\d+)/$', DetailView.as_view(
    model               = Advertisment,
    context_object_name = 'advertisment',
), name='cars-advertisment-detail'),

2 个回答

4

对我来说,创建一个这样的自定义混合类更简单:

class ExtraContextMixin(object):

    def get_context_data(self, **kwargs):
        context = super(ExtraContextMixin, self).get_context_data(**kwargs)
        context.update(self.extra())
        return context

    def extra(self):
        return dict()

之后,你可以直接在这个混合类的基础上创建一个子类,然后像这样重写 extra

class MyDetailView(ExtraContextMixin, DetailView):

    def extra(self):
        extra = Extra.objects.all()
        return dict(extra = extra)

我觉得这样做比重写 get_context_data 要干净一些。

10

当然,你只需要重写一下 get_context_data 方法,就可以往上下文中添加内容了。

path('<int:pk>/', YourDetailView.as_view(), name='cars-advertisment-detail'),

class YourDetailView(DetailView):
    context_object_name = 'advertisment'
    model = Advertisement

    def get_context_data(self, **kwargs):
        """
        This has been overridden to add `car` to the template context,
        now you can use {{ car }} within the template
        """
        context = super().get_context_data(**kwargs)
        context['car'] = Car.objects.get(registration='DK52 WLG')
        return context

撰写回答