如何创建django过滤器的链接
场景:
产品可以在数据库中定义多个属性,我希望能够通过这些属性进行过滤。
由于我还没有找到使用django-filter使用动态属性的方法,目前通过使用django过滤器MethodFilter
来实现, MethodFilter
作为查询字符串传递的属性解析为:
/products?attribute=size_2&attribute=color_red
像这样的网址被解析并且可以工作。
问题是建立网址:
我无法找到合理的方法来构建网址,这会考虑当前的搜索参数并添加/替换这些参数。
Django似乎迫使我使用urlconf,但django-filter使用查询字符串参数。
我试图达到的是这样的:
该用户在页面/products?attribute=size_10
上显示具有该尺寸的所有产品。 当他点击“红色”链接时,新的url变成: /products?attribute=size_10&attribute=color_red
你能指出我实现这个Django的方式吗?
如果您在中间件中包含"django.core.context_processors.request",
那么可以在您的模板中访问request.get。
然后你可以构建一个过滤器,在构建你正在谈论的链接时返回你想要的'GET'变量。
这是我做的一个代码:
@register.simple_tag(takes_context=True)
def lessonapp_preserved_filters(context, url, dayofweek):
opts = context.get('opts')
preserved_filters = context.get('preserved_filters')
parsed_url = list(urlparse(url))
parsed_qs = dict(parse_qsl(parsed_url[4]))
merged_qs = dict()
if opts and preserved_filters:
preserved_filters = dict(parse_qsl(preserved_filters))
match_url = '/%s' % url.partition(get_script_prefix())[2]
try:
match = resolve(match_url)
except Resolver404:
pass
else:
current_url = '%s:%s' % (match.app_name, match.url_name)
changelist_url = 'admin:%s_%s_changelist' % (opts.app_label, opts.model_name)
if changelist_url == current_url and '_changelist_filters' in preserved_filters:
preserved_filters = dict(parse_qsl(preserved_filters['_changelist_filters']))
preserved_filters['dayofweek__exact'] = dayofweek
merged_qs.update(preserved_filters)
merged_qs.update(parsed_qs)
parsed_url[4] = urlencode(merged_qs)
return urlunparse(parsed_url)
然后在模板中我使用它是这样的:
{% lessonapp_preserved_filters adm_url '1' %}
链接地址: http://www.djcxy.com/p/38729.html