如何自定义 Django Oscar Category_tree 模板标签并从类别 URL 中删除 pk?

问题描述 投票:0回答:1

我正在使用 Django Oscar 开发一个电子商务项目,我遇到了一个似乎无法解决的问题。我的目标是自定义类别 URL 以仅使用 slug,而不是同时使用 slug 和 pk,但我在实现这一点时遇到了困难。这是我到目前为止所做的:

  1. 我想要实现的目标: 我想从 Django Oscar 中的类别 URL 中删除 pk。现在,我的网址如下所示:

    http://127.0.0.1:8000/category/metal-detectors_2/
    我希望它们看起来像这样:
    http://127.0.0.1:8000/metal-detectors/

  2. 我的设置:

  • 我正在使用 Django Oscar 的分叉目录应用程序,我正在其中进行自定义。
  • 我有一个自定义模板categories.html,我试图在其中循环遍历类别及其子类别。
  • 我在目录应用程序下的templatetags文件夹中创建了一个自定义模板标签category_tree来处理类别渲染。
  1. 问题: 我正在使用 {% Category_tree as tree_categories %} 模板标签来渲染类别,但由于在 URL 构造中使用 pk ,它似乎失败了。我想将其修改为仅依赖category_slug。但是,我不断收到以下错误:
    NoReverseMatch: Reverse for 'category' with keyword arguments '{'category_slug': 'metal-detectors', 'pk': 2}' not found.

这是我的自定义category_tags.py中的category_tree标签的一部分:

@register.simple_tag(name="category_tree")
def get_annotated_list(depth=None, parent=None):
    # Logic to retrieve categories
    # ...
    info = CheapCategoryInfo(
        node,
        url=node._get_absolute_url(tree_slug),  # Uses both slug and pk
        num_to_close=[],
        level=node_depth - start_depth,
    )
    annotated_categories.append(info)

我尝试过的: 我像这样修改了类别模型中的 get_absolute_url 方法来尝试删除 pk:

def get_absolute_url(self):
    return reverse(
        "catalogue:category",
        kwargs={"category_slug": self.slug},  # Removed pk here
    )

我还自定义了 urls.py 以从 URL 模式中删除 pk:

re_path(r'^(?P<category_slug>[\w-]+)/$', CustomProductCategoryView.as_view(), name='category') 

我正在尝试像这样循环遍历categories.html中的类别:

{% load category_tags %}
<ul class="filter-categories__list">
    {% category_tree as tree_categories %}
    {% for category in tree_categories %}
        <li>{{ category.name }} - URL: {{ category.get_absolute_url }}</li>
    {% endfor %}
</ul>

问题: 如何正确修改 Django Oscar 以从类别 URL 中删除 pk 并仅使用category_slug? 有没有更好的方法来自定义category_tree模板标签来实现这一点? 任何指导将不胜感激!我对 Django Oscar 比较陌生,因此适合初学者的解释会非常有帮助。

提前致谢!

django django-views django-oscar
1个回答
0
投票

检查此教程链接可能会有所帮助https://youtu.be/i8Xsb3Es04Y

© www.soinside.com 2019 - 2024. All rights reserved.