首页 > 解决方案 > 使用 RoutablePageMixin 显示给定类别

问题描述

在我的目录应用程序中,我希望定义“路线”和模板,因此当我单击 PaintingDetailPage 中的给定类别时,它会重定向到 PaintingIndexPage 并显示该类别下的所有详细信息页面。我可以迁移,在 Admin 中输入输入并将其显示在 PaintingDetailPage 上...但是,当我单击一个类别时,它打开了 PaintingIndexPage 并显示所有项目,无论它们的类别...我找不到错误...

我在我的博客应用程序中应用了完全相同的代码,它工作得很好。我可以按类别显示项目...但是当我将完全相同的代码复制到 Calalog 应用程序时它不起作用(在修改页面的名称、模型等时)我假设我错过了一个错字(或更大的问题?)...但我找不到它。

任何输入将不胜感激。

这是我的代码:

模型.py:

class PaintingIndexPage(RoutablePageMixin, Page):

template = "catalog/painting_index_page.html"
max_count = 1

subtitle = RichTextField(
    ...

content_panels = ...


def get_context(self, request, *args, **kwargs):
    """Adding custom stuff to our context."""
    context = super().get_context(request, *args, **kwargs)
    # Get all posts
    paintings = PaintingDetailPage.objects.live().public().order_by('-first_published_at')

    if request.GET.get('tag', None):
        tags = request.GET.get('tag')
        paintings = paintings.filter(tags__slug__in=[tags])
    
    paginator = Paginator(paintings, 20)
    # Try to get the ?page=x value
    page = request.GET.get("page")
    try:
        paintings = paginator.page(page)
    except PageNotAnInteger:
        paintings = paginator.page(1)
    except EmptyPage:
        paintings = paginator.page(paginator.num_pages)
    context["paintings"] = paintings
    context["categories"] = PaintingCategory.objects.all()
    return context


    return render(request, "catalog/painting_index_page.html", context)

@route(r"^category/(?P<cat_slug>[-\w]*)/$", name="category_view")
def category_view(self, request, cat_slug):
    context = self.get_context(request)

    try:
        category = PaintingCategory.objects.get(slug=cat_slug)
    except Exception:            
        category = None

    if category is None:
        pass

    context["paintings"] = PaintingDetailPage.objects.live().public().filter(categories__in=[category])

    return render(request, "catalog/painting_index_page.html", context)

详细视图:

class PaintingDetailPage(Page):

template = "catalog/painting_detail_page.html"

parent_page_types = ["catalog.PaintingIndexPage"]

subtitle = ...
tags = ClusterTaggableManager(through="catalog.PaintingPageTag", blank=True)
categories = ParentalManyToManyField("catalog.PaintingCategory", blank=True)
...

content_panels = Page.content_panels + [
    ImageChooserPanel("image"...

    MultiFieldPanel([
        FieldPanel('categories', widget=forms.CheckboxSelectMultiple),
    ],
        heading="Category",
        classname="collapsible collapsed",
    ),

详细模板:

% extends "base.html" %}

{% 加载 wagtailimages_tags wagtailcore_tags %}

{% block content %} {% image self.image fill-1200x300 as banner %}

<div class="container mt-5 mb-5">
    <div class="text-center">
        <h1>{{ self.title }}</h1>
        {% if self.categories.count %}
            <div style="padding: 0 20px 20px">
                {% for cat in self.categories.all %}
                    <a href="?category={{ cat.slug }}">
                        {{ cat.name }}
                    </a>{% if not forloop.last %}, {% endif %}
                {% endfor %}
                </div>
        {% endif %}

        

        </div>
    </div>
</div>

<h2>Categories</h2>
<ul>
    {% for cat in self.categories.all %}
        <li>
            <a href="{{ self.get_parent.url }}?category={{ cat.slug }}">
                {{ cat.name }}
            </a>
        </li>
    {% endfor %}
</ul>



...

{% 端块 %}

标签: redirectdjango-urlswagtail

解决方案


推荐阅读