我需要从GET
网址中删除参数。我没有找到一个“正确”的方法,所以我写了这样的自己的过滤器:
@register.filter(name='url_without_parameter')
def url_without_parameter(arg1, arg2):
"""
Removes an argument from the get URL.
Use:
{{ request|url_without_parameter:'page' }}
Args:
arg1: request
arg2: parameter to remove
"""
if arg1.GET.getlist(arg2):
# get all parameters :
full_url = urlparse.urlparse(arg1.get_full_path())
parameters = {}
# reconstruct query
for key, value in urlparse.parse_qsl(full_url.query):
if parameters.get(key, None) is None:
parameters[key] = value
# remove parameters
if parameters.get(arg2) is not None:
del parameters[arg2]
arg1.META['QUERY_STRING'] = u'&'.join([
u'{}={}'.format(key, value)
for key, value in parameters.iteritems()])
return arg1.get_full_path()
然后我就像这样使用它:
{{ request|url_without_parameter:'page' }}
先进的方法是:
href="{{ request|url_without_parameter:'page' }}&page={{ obj.page }}"
我的问题是,当URL的GET
中没有其他参数时。这会创建“/test&page=1
”之类的网址,但这并不好。
所以我必须编写另一个过滤器来使其像这样工作:
href="{{ request|url_without_parameter:'page' }}{{ request|url_get_separator }}page={{ obj.page }}"
使用我的url_get_separator
过滤器。
@register.filter(name='url_get_separator')
def url_get_separator(arg1):
"""
Returns '?' or '&' if there are QUERY parameters in the URL
Use:
{{ request|url_get_separator }}
Args:
arg1: request
"""
return u'&' if arg1.META.get('QUERY_STRING', '') else u'?'
我发现所有这些都非常丑陋且难以阅读且难以维护。您是否知道在网址中简单替换GET
的值的其他更好方法?
答案 0 :(得分:0)
我主要使用这个标签作为我项目中的分页链接,即为了保留所有内容而不是切换数字超链接的页码,你会注意到我将_pjax
param存在,如果它存在:
@simple_tag
def query_transform(request, **kwargs):
"""usages: {% query_transform request page=1 %}"""
updated = request.GET.copy()
for k, v in kwargs.iteritems():
updated[k] = v
# trash any pjax params, we never want to render those
try:
del updated['_pjax']
except KeyError:
pass
return updated.urlencode()
我想也许你想要类似的东西,也许你想要的伎俩就是在copy
字典上调用request.GET
并弄乱它,而不是URL。