当我使用Django的通用我怎样才能把两种模式

问题描述:

我有两个型号:广告和横幅当我使用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'), 
) 
+1

读这一个: http://stackoverflow.com/questions/7576202/how-can-i-pass-two-models-to-a-class-based-generic-view – catherine 2013-02-09 07:24:51

您需要重写类基于视图的方法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 

我想你需要更新你的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'), 

艾丹的回答是好,如果你只想做一个单一的视图,但如果你想自动在每个网页上的横幅广告,你有两个主要选择。

一是创建一个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 }}