0

我有两个模型:广告和横幅

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

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'),
)
4

2 回答 2

1

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

一种是创建一个呈现横幅的模板标签,然后将此标签添加到您希望显示横幅的模板中。

您的标签可能如下所示:

@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 %}

您拥有的另一个选项是创建自定义模板上下文处理器。这会将您的横幅作为所有请求中的普通变量注入。这可能更简单:

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

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

于 2013-02-09T07:59:00.207 回答
1

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

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

我想您还需要更新您的 url conf 以包含 Banner 模型的主键。

from your_app.views import YourDetailView

  url(r'^(?P<ad_pk>\d+)/(?P<banner_pk>\d+)/$', YourDetailView.as_view(), name='cars-advertisment-detail'),
于 2013-02-09T07:20:02.333 回答