我有两种模式:广告和横幅
当我使用“通用视图”时如何在同一时间汇集在一起 下面的代码只带来一个广告
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'),
)
答案 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 }}
。