我有一个名为“博客”的应用程序,其中有一个名为“Entry”的模型。我使用基于类的泛型来查看此条目,我很高兴。
现在,另外一个名为“Eventapp”的应用程序有一个名为“Event”的模型。现在我想查询这个模型的几个事件,然后将它发送到上面提到的基于类的泛型。我该怎么做?
以下是我在urls.py
到目前为止查看Entry模型的内容:
urlpatterns = patterns('',
url(r'^$', ArchiveIndexView.as_view(
model=Entry, paginate_by=5, date_field='pub_date',template_name='homepage.html'),
),
url(r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/(?P<slug>\w+)/$',
DetailView.as_view(model=Entry, queryset=Entry.objects.all(), slug_field='slug')),)
有没有办法以某种方式将事件模型传递给ArchiveIndexView.as_view()
和DetailView.as_view()
?
答案 0 :(得分:1)
在我看来,您希望将您的活动放在多个页面上,context processor可能是适合您的工具。它应该允许您在每个模板的上下文中访问事件的查询集:
from eventapp.models import Event
def event_provessor(request):
return {'events': Event.objects.all()}
由于查询集的懒惰,如果您不需要列表,则不必害怕访问数据库,只有在迭代events
时才会运行查询。
当然你也可以。将视图子类化并将事件添加到上下文中,但如果多个视图受到影响,则上下文处理器可能更有意义!
答案 1 :(得分:1)
由于你正在使用Django基于类的视图,只需扩展你正在使用的类。
对于DetailView,在应用的views.py
文件中添加新的视图类:
from django.views.generic import DetailView
from blog.models import Entry
from eventapp.models import Event
class BlogEntryView(DetailView):
"""Extends the detail view to add Events to the context"""
model = Entry
def get_context_data(self, **kwargs):
context = super(BlogEntryView, self).get_context_data(**kwargs)
context['events'] = Event.objects.all()
return context
我们省略了queryset和slug字段名称,因为给定模型名称,DetailView类默认为Entry.objects.all()
查询集,而'slug'是默认的slug字段名称。如果您想明确声明这些,请在model
作业下添加它们。
然后更新您的urls.py
文件:
from blog.views import BlogEntryView
urls = patterns('',
url(r'^$', ArchiveIndexView.as_view(
model=Entry, paginate_by=5,
date_field='pub_date',template_name='homepage.html'),
),
url(r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/(?P<slug>\w+)/$',
BlogEntryView.as_view()),
)
详细信息请参见class based generic view documentation,以便启动。