0

我已经尝试了几个小时,并查看了很多文档,但我无法正确理解。我认为我不会很快看到解决方案,所以也许有人可以看到问题所在?

我想要一个视图来显示我的所有类别以及与这些类别相关的所有条目。

我试图遵循这个例子: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

任何帮助深表感谢!

编辑:

添加了我的自定义管理器。我只有在我的模板中没有显示未发布的条目以列出我的所有类别及其所有连接的条目时遇到问题,例如:

  • 第一类
    • 发表条目 1
    • 发表条目 3
  • 第 2 类
    • 发表条目 7
    • 发表条目 9

我使用这个 for 循环获取连接的整体,但它也列出了未发布的整体:

{% for entry in category.entry_set.all %}

4

3 回答 3

1

你得到这个错误是因为self.args所有位置参数的元组是空的,因为你没有在你的 url 中指定一个组并且你试图获取一个空元组的第一个元素(self.args[0]

将您的 url 更改为:
url(r'^blog/(\w+)/$', CategoryList.as_view()),以便能够使用捕获类别self.args[0]

文档复制:

完成这项工作的关键部分是,当基于类的视图被调用时,各种有用的东西都存储在 self 上;以及请求 (self.request) 这包括根据 URLconf 捕获的位置 (self.args) 和基于名称的 (self.kwargs) 参数。

除此之外,我在您的代码中看不到任何其他错误。

于 2012-09-20T19:45:01.700 回答
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 %}
于 2012-09-21T09:32:37.390 回答
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 %}
于 2013-04-15T20:11:48.593 回答