我对项目使用Django 1.3的基于类的基类视图。他们非常好,但我想成为DRYer。我有一个页面显示我们收到的新闻报道列表,另一个显示我们发布的文章列表。在概览页面上,我需要显示这两个列表。我想创建一个复合视图,该视图接受两个视图并创建一个包含两个附加查询集的上下文。Django基于类的视图复合
回答
也许你可以重写get_context_data方法来将其他数据添加到上下文中?
def get_context_data(self, **kwargs):
context = super(AuthorListView, self).get_context_data(**kwargs)
# Add in a QuerySet of all the books
context['press_list'] = Press.objects.all()
context['articles_list] = Article.objects.all()
return context
,并在您的模板,你可以得到新闻列表,并使用{{ press_list }}
和{{ articles_list }}
文章列表。
在我看来,一个视图只是一个页面。一个视图可以有多种形式,我认为这是您示例中更好的解决方案。
只需将模板分成几个文件,其中每个表单都有一个小模板,然后使用模板include指令将它们拼接在一起。这还具有附加的优点,即表单可以在其他视图中重复使用,非常简单。
您的解决方案基本上像框架,但在服务器上而不是在浏览器中。
最简单的方法:
不要在这两个查询集手动使用一个通用的视图和paginator对象。
这段时间不会那么长,也不是某些行会干掉你的DRY IMO。
通用的,但很长的路要走:
创建包裹__init_
_和get_context
方法来传递参数,两个ListView控件实例的视图。
init should instanciate both ListView
,传递参数并将实例添加到包装的属性。
get_context
应调用get_context Listview实例方法,并将它们合并到一个上下文对象中。
请务必为每个ListView
设置不同的template_object_name
,以便它们在上下文字典中不会互相覆盖。
做,在一个通用的方法,并且不要忘记pusblish上djangosnippet :-)
Kenzic能够通过执行以下操作来实现这一点,你的代码:
composite.py:
from django.views.generic.base import TemplateResponseMixin, View
class BaseCompositeView(TemplateResponseMixin, View):
composite_views = []
def get_composite_views(self):
return self.composite_views
def get_context_data(self, request, *args, **kwargs):
context = {}
composite_views = self.get_composite_views()
for composite_view in composite_views:
cls = composite_view[0]
try:
clsview = cls.as_view(**composite_view[1])
except IndexError:
clsview = cls.as_view()
view = clsview(request, *args, **kwargs)
context_data = view.context_data
context.update(context_data)
return context
def get(self, request, *args, **kwargs):
context = self.get_context_data(request, *args, **kwargs)
return self.render_to_response(context)
views.py:
from django.views.generic import TemplateView, ListView, DetailView
from composite import BaseCompositeView
from .models import *
class MediaCoverageList(ListView):
queryset = MediaCoverageItem.objects.order_by('-date')
class PressKitList(ListView):
queryset = PressKit.objects.all()
class NewsroomLanding(BaseCompositeView):
template_name = 'newsroom/landing.html'
composite_views = [
(MediaCoverageList,{
'paginate_by': 10,
},),
(PressKitList,)
]
如果您不想因某人的回答而获得代表权,则可以将其切换为CW。此外,两个月过去了,Kenzic没有创造答案;其他人介入并提供正确答案是合理的。 – casperOne 2011-11-28 14:38:54
- 1. 基于类的基于Django的视图
- 2. 子类化基于Django类的视图?
- 3. Hibernate的复合键基于视图
- 4. Django 1.9基于类的视图singleton
- 5. django haystack - 基于类的视图
- 6. Django基于类的视图YearArchiveView
- 7. 避免在Django基于类的视图中重复
- 8. Django LoginForm中间件基于类视图
- 9. 从另一个基于类的视图Django调用基于视图
- 10. 用基于类的视图编写Django详细视图
- 11. 基于复合基线的Clearcase configspec视图
- 12. 基于类的视图和基于视图的功能
- 13. 基于Django类的视图中的类变量与方法
- 14. Django:在基于类的视图中添加另一个子类
- 15. 基于视图的视图基于等
- 16. Django基于邮件的视图
- 17. 基于Django的视图登录
- 18. 覆盖Django的通用的基于类的视图部件
- 19. Django基于类的视图中的嘲讽函数
- 20. 如何访问基于类视图自己的参数 - Django的
- 21. Django中的Kwargs和基于类的视图
- 22. 基于类的通用视图的Django表单前缀
- 23. Django的基于类的视图返回空字符串时,POST
- 24. 如何在Django的基于类的视图中链接外键
- 25. Django带参数的反向网址到基于类的视图
- 26. 如何覆盖Django中基于类的视图中的`as_view`?
- 27. Django auth_view和通用的基于类的视图
- 28. 反向的URL基于Django的类视图
- 29. 将基于功能的视图转换为仅基于视图的基于类的视图(对象)
- 30. 基于Django基于GET参数的视图
而不是更新您的帖子,你应该回答你自己的问题。通过这种方式,社区可以一目了然地知道有一个解决方案,它是什么。 – Dave 2011-09-26 10:19:11
当我开始使用Django时,我开始发现通用视图是几乎所有东西的工具。我修改,修补,并修复,以做我想要的。问题是,那不是他们正在解决的问题。一旦你超越了它们的目标限制,只需使用普通视图。 – 2011-10-03 22:10:43
@Dave我将Kenzic的解决方案转化为答案,并标记答案,希望版主将它归于Kenzic而不是我。 – akaihola 2011-11-28 07:45:49