当我使用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'),
)
答
您需要重写类基于视图的方法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 }}
。
读这一个: http://stackoverflow.com/questions/7576202/how-can-i-pass-two-models-to-a-class-based-generic-view – catherine 2013-02-09 07:24:51