Мне нужно было удалить параметр с URL-адреса GET
. Я не нашел «правильный» способ сделать это, так что я написал свой собственный фильтр, как это:Как правильно удалить параметр 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 }}"
Моя проблема в том, когда есть не другие параметры в GET
в URL. Это создает URL-адреса, такие как «/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
в URL-адресах?
Вы можете попробовать использовать инструменты django-url, в частности теги 'overload_params' и' del_params' [https://bitbucket.org/monwara/django-url-tools#rst-header-id39) , См. Также [этот вопрос] (http://stackoverflow.com/questions/16469224/django-template-tag-to-insert-or-replace-url-parameter). – Alasdair