Django 模板标签插入或替换 URL 参数

Posted

技术标签:

【中文标题】Django 模板标签插入或替换 URL 参数【英文标题】:Django template tag to insert or replace URL parameter 【发布时间】:2013-05-04 08:50:50 【问题描述】:

是否有人知道 Django 模板标签,它采用当前路径和查询字符串并插入或替换查询字符串值?

例如给 /some/custom/path?q=how+now+brown+cow&page=3&filter=person

的请求

调用% urlparam 'page' 4 % 将生成/some/custom/path?q=how+now+brown+cow&page=4&filter=person

从头开始编写这并不难,但由于这似乎是一项非常常见的任务,我希望这样的标签是内置的。然而,在阅读了docs 和谷歌搜索后,我似乎找不到任何人公开了这样的标签。

【问题讨论】:

这不是一个常见的情况,它是一些其他逻辑/结构问题的迹象。这有什么用例?我的意思是,你为什么要更改模板中的 URL,而不是修复呈现模板的视图? @BurhanKhalid,我强烈反对。考虑以下情况。我想在搜索页面上呈现一系列分页链接。 URL 包含几个查询参数(如我的示例中)。呈现分页链接的分页代码不必显式地给出所有这些参数。 Django 的管理员似乎到处都有这种行为。点击一个链接来优化结果不应丢失所有现有参数。 好的用例,看我的回答。我问是因为有时这样的问题实际上是在寻求解决方案而不是问题的帮助。 【参考方案1】:

这是我在 Django 1.3 项目中的做法。和你一样,我希望找到这个内置的,但最终在视图中对其进行了编码:

def remove_url_param(url, params):
    if not isinstance(params, list):
        params = [params,]
    if isinstance(url, unicode):
        # urlencode doesn't like unicode
        url = url.encode('utf8')

    (scheme, netloc, path, query, fragment) = urlparse.urlsplit(url)
    param_dict = parse_qs(query)
    for p in params:
        try:
            del(param_dict[p])
        except KeyError:
            pass
    query = urllib.urlencode(param_dict, True)
    return urlparse.urlunsplit((scheme, netloc, path, query, fragment))

然后我用它来创建基本 URL:

page_url_unordered = putils.remove_url_param( request.get_full_path(), ['order', 'ajax'] )

然后在模板中:

<a href=" page_url_unordered &amp;order=price">Price</a>
<a href=" page_url_unordered &amp;order=size">Size</a>

【讨论】:

【参考方案2】:

由于我自己没有使用过这些工具,所以我只是向您推荐:

django-url-tools 有 url_params 模板标签,似乎可以做你想做的事 django-more-template-tags-and-filters 有一些 helper tags 用于操作 url 和参数

仅供参考,我个人使用 jsurl 库在 javascript 中进行这种 url 操作。

希望对您有所帮助。

【讨论】:

【参考方案3】:

我想在搜索页面上呈现一系列分页链接。这 URL 包含几个查询参数(如在我的示例中)。这 呈现分页链接的分页代码不应该是 明确给出所有这些参数。 Django的管理员似乎有 这种行为无处不在。

这是通过将django.core.context_processors.request 添加到TEMPLATE_CONTEXT_PROCESSORS 来启用的(默认情况下不启用)。这将为您的模板添加一个request 变量,即HttpRequest object。

从那里,您可以使用 request.get_full_path 获取带有完整查询字符串的当前 URL,然后将您的自定义查询附加到它。

如果您的页面是/search?q=foo+bar,并且您希望新链接是/search?q=foo+bar&amp;page=4&lt;a href=" request.get_full_path &amp;page=4"&gt;page 4&lt;/a&gt;

【讨论】:

如果您的页面是 /search?q=foo+bar&page=1,而您希望新链接是 /search?q=foo+bar&page=2 怎么办? 那你问一个新问题:) 是的,我知道...但也许您知道一个简单的解决方案。我最终制作了一个像这样的模板标签***.com/a/12423248/246435

以上是关于Django 模板标签插入或替换 URL 参数的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 模板标签中插入 JS 变量

是否可以将查询参数传递给 Django % url % 模板标签?

Django:URL模板标签中的模型参数

Django:在 URL 模板标签中保留 GET 参数

在 django 模板 URL 标签中传递参数

使用字符串文字作为 Django 模板中模板标签的参数