当我使用Django通用时我怎么能带两个模型

时间:2013-02-09 07:11:11

标签: python django

我有两种模式:广告和横幅

当我使用“通用视图”时如何在同一时间汇集在一起 下面的代码只带来一个广告

urlpatterns = patterns('',


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

    url(r'^$', SearchView.as_view(), name='cars-advertisment-search'),
)

2 个答案:

答案 0 :(得分:1)

您需要覆盖基于类的视图的get_context_data()方法(如docs中所述)。

from django.views.generic import DetailView

class YourDetailView(DetailView):

    model = Advertisment
    context_object_name = 'advertisment'

    def get_context_data(self, *args, **kwargs):
        context = super(YourDetailView, self).get_context_data(*args, **kwargs)
        if 'banner_id' in self.kwargs:
            context['banner'] = get_object_or_404(Banner, pk=self.kwargs['banner_id']
        return context

我猜您需要更新您的网址,以便包含Banner模型的主键。

from your_app.views import YourDetailView

  url(r'^(?P<ad_pk>\d+)/(?P<banner_pk>\d+)/$', YourDetailView.as_view(), name='cars-advertisment-detail'),

答案 1 :(得分:1)

如果您只想为单个视图执行此操作,Aidan的答案很好,但如果您想自动在每个页面上显示横幅,则有两个主要选项。

一种方法是创建一个呈现横幅的template tag,并将此标记添加到您希望展示横幅的模板中。

您的代码可能如下所示:

@register.inclusion_tag('banner.html')
def banner_display():
    random_banner = Banner.objects.order_by('?')[0]
    return {'the_banner': random_banner}

然后,您将创建一个显示横幅的模板:

<a href="{{ the_banner.url }}"><img src="{{ the_banner.url|safe }}" /></a>

在您需要横幅的模板中,您只需说{% banner_display %}

您拥有的另一个选项是创建自定义template context processor。这会将您的横幅作为所有请求中的正常变量注入。这可能更简单:

def banner_display(request):
    random_banner = Banner.objects.order_by('?')[0]
    return {'the_banner': random_banner}

您应将其保存在文件中,然后将其添加到TEMPLATE_CONTEXT_PROCESSORS设置中。现在,在每个模板中,您都有一个变量{{ the_banner }}