[英]Using get_queryset() method in ListView, Django 1.9
我一直很難使ListViews能夠按預期在我正在處理的博客項目上呈現。
我有一個Tag模型,它是Post模型的一部分,如下所示(來自我在models.py中的Post模型):
class Post(models.Model):
(...)
tags = models.ManyToManyField(Tag)
views.py
TagListView如下:
class TagListView(ListView):
def get_queryset(self):
slug = self.kwargs['slug']
try:
tag = Tag.objects.get(slug=slug)
return tag.post_set.all()
except Tag.DoesNotExist:
return Post.objects.none()
url如下(它包含在項目中,就像url(r'^blog/?', include('blog.urls')),
一樣,如下所示:
url(r'^tag/(?P<slug>[a-zA-Z0-9-]+)?/?$', TagListView.as_view(
paginate_by=5,
model=Tag,
)),
據我了解,訪問一個URL(對於本例而言,應位於localhost:8000/blog/tag/<name-of-tag-here>
在views.py中調用TagListView,然后使用get_queryset()
生成具有相同標簽的標簽的帖子的ListView的方法,然后查找模板(位於/blog/templates/blog
),在我正在查看的教程中,該/blog/templates/blog
稱為tag_post_list.html
,但是-該文檔尚不清楚ListView如何找到要呈現的模板,而我只是遵循一個過時的教程。
對於將哪些變量傳遞到html模板以及如何訪問它們,我有些困惑。 從結果中我可以清楚地看到, get_queryset()
實際上並不僅僅返回具有相同標簽列表的帖子。 此外,盡管很明顯我的base.html
文件中的其他標記和元素都在顯示,但是我的css也不呈現(我已經為之發表了單獨的文章) 。
模板以{% extends 'base.html' %}
(位於/blog/templates/
)開始,並通過{% for post in object_list %}
訪問{% for post in object_list %}
。 object_list
顯然不包含我認為的內容,據我了解,這應該是由於我濫用ListView的get_queryset()
方法的方式get_queryset()
。
謝謝。
這里有很多問題需要解決。 幾個答案:
您的ListView
具有template_name
屬性,您可以在其中指定要使用的模板,如下所示:
class TagListView(ListView):
template_name = "tag_post_list.html"
def get_queryset(self):
slug = self.kwargs['slug']
try:
tag = Tag.objects.get(slug=slug)
return tag.post_set.all()
except Tag.DoesNotExist:
return Post.objects.none()
請訪問此站點 ,以獲取基於類的視圖的可用屬性的快速列表。
第二個答案-您是在說:
tag = Tag.objects.get(slug=slug)
return tag.post_set.all()
...您認為實際上並沒有返回正確的Post
對象。 從您的代碼尚不清楚為什么是這種情況。 您的觀點似乎是正確的,但正如Daniel Roseman指出的那樣,它應該基於Post
而不是Tag
模型。 覆蓋get_queryset
方法以返回Post
對象,但這意味着這不是有問題的問題。 解決第一個問題實際上可能會解決第二個問題,因為object_list
從未被調用是因為未調用模板...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.