Django多个ListView到一个html页面

时间:2014-11-25 21:15:07

标签: html django listview web django-queryset

我希望能够在我的blog.html上访问post_list10photo_list,但是我只能在这样写的时候访问它。有谁知道怎么写它所以我可以访问它们?

post_list10 = Post.objects.all().order_by("-date")[:10]
photo_list = Photo.objects.all()

urlpatterns = patterns('',

                       url(r'^$', ListView.as_view(
                           queryset=post_list10,
                           template_name="blog.html")),

                       # FOR SOME REASON WHICHEVER COMES FIRST TAKES PRECEDENT. Cannot do both.

                       url(r'^$', ListView.as_view(
                           queryset=photo_list,
                           template_name="blog.html")))

此外,

在我的blog.html中调用列表时,我可以使用

{% for post in object_list %} 
.....

{% endfor %}

为了使用可用的帖子对象,但如果我可以同时访问帖子或照片,我怎么知道我是否正在使用帖子或照片?对不起,如果我的措辞不清楚,我对此很新。

1 个答案:

答案 0 :(得分:3)

解决问题的方法通常包括编写自己的视图。 一种简单的方法如下:

在urls.py中

from views import my_view

urlpatterns = patterns('',
    url(r'^$', my_view, name="my_blog"),
)
在views.py中

from django.shortcuts import render
from django.http import HttpResponse
from django.template import RequestContext, loader

def my_view(request):
    """The view for your blog page"""
    post_list10 = Post.objects.all().order_by("-date")[:10]
    photo_list = Photo.objects.all()

    template = loader.get_template('blog.html')
    context = RequestContext(request,{
        'post_list': post_list10,
        'photo_list': photo_list,
    })
    return HttpResponse(template.render(context))

blog.html中的模板将更改为:

{% for post in post_list %} 
.....

{% endfor %}

{% for photo in photo_list %} 
.....

{% endfor %}

我注意到的另一件事就是这个评论"#对于之前的第一个原因而来的一些原因。不能两者兼顾。"。这确实是正确的,期望的行为。 URL匹配的工作方式是Django从URL模式的顶部开始,然后迭代。在请求中为URL找到的第一个正则表达式匹配是使用的匹配,不再进行进一步搜索。因为您只有^$中的第一个匹配正则表达式urlpatterns。每次有重复的正则表达式时都会发生这种情况,第二种情况永远不会被使用。

一般来说,Django documentation的质量非常高,如果你遇到困难,请阅读。