1

我刚从 django 开始(老实说,还有 python)

我正在尝试获取一个模型方法,该方法可以从当前 URL 中删除 self.slug 并将其返回到模板。

这是我尝试的方法:

class Category(models.Model):
    ...
    def remove_filter(self):
        url = HttpRequest.get_full_path()
        slug = '/' + self.slug
        return url.replace(slug, '')

但正如你可以想象的那样,它不起作用。

模板片段:

{% for object in active_filters %}
    <li><a href="{{ object.remove_filter }}"><i class="icon-remove"></i></a>{{ object }}</li>
{% endfor %}

我的核心目标是通过删除当前对象的 slug 来更改带有 url 的前端图标。

我不知道如何通过意见来做到这一点,但我愿意接受任何建议。

def category_page(request, url):
    slugs = url.split('/')
    active = Category.objects.filter(slug__in=slugs)
    sorted_slugs = []
    for i in active:
        sorted_slugs.append(i.slug)
    if slugs != sorted_slugs:
        url = '/'.join(sorted_slugs)
        return redirect('http://127.0.0.1:8000/catalog/' + url)
    inactive = Category.objects.exclude(slug__in=slugs)
    return render(request, 'category.html', {'active_filters': active,
                                              'inactive_filters': inactive})

谢谢。

4

2 回答 2

2

您可以将所有活动 slug 的列表发送到模板,然后构建自定义模板过滤器来构造修改后的 url。

视图.py

# Send your list of active slugs to the template

return render(request, 'category.html', {
    'active_filters': active,
    'inactive_filters': inactive,
    'slugs': slugs,
})

tags_and_filters.py

import copy

from django import template

register = template.Library()


@register.filter(name='remove_filter')
def remove_filter(category, slugs): 
    copied_slugs = copy.copy(slugs)
    slug = category.slug
    if slug in copied_slugs:
        copied_slugs.remove(slug)
    return '/'.join(copied_slugs)

你的模板

{% for object in active_filters %}
<li>
  <a href="{{ object|remove_filter:slugs }}"><i class="icon-remove"></i></a>{{ object }}
</li>
{% endfor %}
于 2012-12-24T02:17:19.633 回答
0

您的remove_filter方法无权访问当前请求。HttpRequest是类,而不是当前请求实例。

我建议你重写remove_filter自定义标签或过滤器。这样您的函数就可以访问类别和请求实例。您还必须在设置中激活请求模板上下文处理器

于 2012-12-24T02:01:57.653 回答