0

私はこれを数時間試し、多くのドキュメントを調べましたが、正しく理解できません。私はこれに対する解決策がすぐに見つかるとは思わないので、誰かが何が悪いのかを見ることができるかもしれませんか?

すべてのカテゴリと、それらのカテゴリに接続されているすべてのエントリを表示するビューが必要です。

私はこの例に従おうとしました:djangoクラスベース-ビューのトピック

しかし、このエラーが発生します:タプルインデックスが範囲外です

私のモデル:

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()

私のURL

#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
    • 公開されたエントリ1
    • 公開されたエントリ3
  • カテゴリー2
    • 公開されたエントリ7
    • 公開されたエントリ9

これをforループで使用して、接続された全体を取得しますが、公開されていない全体も一覧表示します。

{category.entry_set.allのエントリの%%}

4

3 に答える 3

1

self.argsURLにグループを指定しておらず、空のタプル(self.args[0]) の最初の要素を取得しようとしているため、すべての位置引数のタプルであるが空であるため、この間違いが発生します。


url(r'^blog/(\w+)/$', CategoryList.as_view())を使用してカテゴリをキャプチャできるようにするには、URLを次のように変更します。self.args[0]

ドキュメントからのコピー:

この作業を行うための重要な部分は、クラスベースのビューが呼び出されると、さまざまな有用なものが自分自身に格納されることです。リクエスト(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 に答える