如何将两个模型传递给基于类的通用视图

时间:2011-09-27 22:02:38

标签: django django-models

我有一个名为“博客”的应用程序,其中有一个名为“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()

2 个答案:

答案 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,以便启动。