我已经尝试了几个小时,并查看了很多文档,但我无法做到正确。我不认为我会很快看到这个问题的解决方案,所以也许有人会看到什么问题?
我想要一个视图来显示我的所有类别以及我对这些类别的所有连接条目。
我试图效仿这个例子:django class-based-views topic
但是我收到了这个错误:元组索引超出范围
我的模特:
STATUS_CHOICES = (
('d', 'Draft'),
('p', 'Published'),
('w', 'Whitdrawn'),
)
class PublishedManager(models.Manager):
use_for_related_fields = True
def get_query_set(self):
return super(PublishedManager, self).get_query_set().filter(status='p')
class Category(models.Model):
name = models.CharField()
slug = models.SlugField()
status = models.CharField(max_length=1, default='d', choices=STATUS_CHOICES)
published = PublishedManager()
class Entry(models.Model):
name = models.CharField()
slug = models.SlugField()
category = models.ForeignKey(Category)
status = models.CharField(max_length=1, default='d', choices=STATUS_CHOICES)
published = PublishedManager()
我的网址
#View for all categories and all connected entries
url(r'^blog/$', AllCategories.as_view()),
#View for one category - and all the connected entries
url(r'^blog/(?P<slug>[-\w]+)/$', CategoryList.as_view()),
我的观点
class AllCategories(ListView):
context_object_name = "category_list"
queryset = Category.published.all()
class CategoryList(ListView):
template_name = 'blog/category_and_connected_entries.html'
def get_queryset(self):
self.category = get_object_or_404(Category, self=self.kwargs['slug'])
return Entry.published.filter(category=self.category)
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super(CategoryList, self).get_context_data(**kwargs)
# Add in the category
context['category'] = self.category
return context
非常感谢任何帮助!
修改
添加了我的自定义管理器。 我只是在我的模板中没有显示未提供的entires的问题,以便列出所有我的类别和所有他们连接的entires,例如:
我使用它来循环获取连接的entires,但它也列出了未显示的entires:
{%for category in category.entry_set.all%}
答案 0 :(得分:1)
你得到这个错误,因为self.args
是所有位置参数的元组是空的,因为你没有在你的网址中指定一个组,而你正试图获得一个空元组的第一个元素({ {1}})
将您的网址更改为:
self.args[0]
,
为了能够使用url(r'^blog/(\w+)/$', CategoryList.as_view())
从docs:
复制使这项工作的关键部分是什么时候 调用基于类的视图,存储各种有用的东西 自;以及请求(self.request)这包括 捕获位置(self.args)和基于名称(self.kwargs)的参数 根据URLconf。
除此之外,我的代码中没有发现任何其他错误。
答案 1 :(得分:1)
根据您的评论,如果您只是想显示所有带相关条目的类别,那么您需要做的就是使用
获取所有类别def query_set(self):
return Category.objects.all()
然后在你的模板中循环遍历类别和嵌套循环的条目
{% for category in object_list %}
<ul>
<li>{{ category.name }}</li>
{% for entry in category.entry_set.all %}
<li>{{ entry }}</li>
{% endfor %}
</ul>
{% endfor %}
答案 2 :(得分:0)
您可以使用_set.all,我的代码:
views.py
class Categories(models.Model):
model = Category
template_name = "#..."
paginate_by = #...
template
Categories list:
{% for category in object_list %}
Name: {{ category }}
{% for entry in category.entry_set.all|slice:":2" %}
{{ entry }}
{% empty %}
None
{% endfor %}
{% endfor %}