如何正确删除GET参数

时间:2016-07-12 14:13:32

标签: django django-templates

我需要从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的值的其他更好方法?

1 个答案:

答案 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。