链接到Django中的当前页面,使用额外的GET参数?

wribegjk  于 2023-01-14  发布在  Go
关注(0)|答案(5)|浏览(124)

我如何放置一个HTML链接,它指向 * 当前 * 页面,添加额外的GET参数(或覆盖现有参数,如果它们已经存在)?
现在我有这样的想法:

<a href="{{ request.path }}?Key=Value"> My Link </a>

当前,request被传递到页面。如果request.pathhttps://stackoverflow.com/,则生成的链接变为https://stackoverflow.com/?Key=Value

问题是什么?

当然,如果当前URL是https://stackoverflow.com/?PrevKey=PrevValue,则它变为:
https://stackoverflow.com/?PrevKey=PrevValue?Key=Value

注意第二个问号不正确--它实际上应该是:

https://stackoverflow.com/?PrevKey=PrevValue&Key=Value
此外,如果 * 已经 * 有一个同名的键,那么我当前的解决方案将忽略它,而不是覆盖它--这是错误的。
我该如何解决这两个问题?

sf6xfgos

sf6xfgos1#

你需要一个自定义标签,djangosnippets上有几个标签-this one看起来很全面。

bogh5gae

bogh5gae3#

您可以使用:{{request. get_full_path}}以获取带有附加参数的当前路径。

njthzxwz

njthzxwz4#

我只是一个Django的初学者,所以你必须对我的回答持保留态度。
首先,根据文档,request.path应该返回不带域的页面的路径,所以如果请求的是http://example.com/request.path应该只是"/",如果我错了请纠正我。
更重要的是,request.path没有任何查询参数,所以如果请求的页面是http://example.com/?PrevKey=PrevValue,那么request.path仍然是"/",如果想要获得查询参数,必须使用GET和POST属性的类似字典的访问(在本例中为GET),或者更好的方法是通过QueryDict方法访问它们。
我在这里要做的(这绝不是最好的方法或代码)是准备一个自定义模板过滤器,在其中传递当前请求对象和要测试的键-值对。
这就是你的模板代码的样子。注意你仍然可以硬编码键值对,尽管这里它被格式化为一个带有“键冒号值”的字符串。过滤器函数可以处理(如果你需要)不止一组键值对。

<a href="{{ request | addQueryParameter:'Key:Value'}}">My Link</a>

过滤器功能:

from urllib import urlencode

def addQueryParameter(request, parameter):
    # parse the key-value pair(s) in parameter (which looks like a JSON string)
    # then add to dictionary d
    # note i am not taking into account white-space.
    for param in string.split(','):
        key, value = param.split(':', 1)
        d[key] = value

    # check if any keys in d are already in the request query parameters
    # if so, delete from d. If I misunderstood your question, then refactor 
    # to delete from request.GET instead:
    for key in d.keys():
        if key in request.GET.keys():
             del d[key]

    # add the keys in request.GET into d:
    d.extend(request.GET.items())

    # convert dictionary of key value pairs into a query string for urls, 
    # prepend a ?
    queryString = "?%s" % urlencode(d)
    return "%s%s" % (request.path, queryString if queryString else "")

我应该指出,如果请求是针对页面http://example.com/login/?prev=news,而您的模板看起来像

<a href="{{ request | addQueryParameter:'goto:dashboard,feature:products'}}">My Link</a>

那么输出将是(希望如此,如果它起作用):

<a href="/login/?prev=news&goto=dashboard&feature=products">
My Link</a>
<!-- the order of the above parameters may differ -->

注意这个链接中没有域(例如http://example.com/部分),这是因为过滤器没有添加它,但是你可以修改它来添加。
我会留给你注册这个模板过滤器。更多在这里。希望这有帮助。

yrefmtwq

yrefmtwq5#

JavaScript解决方案非常适合这种情况。示例:

<div class="pagination">
        <span class="step-links">
            {% if page_obj.has_previous %}
                <a page_number="1">First Page</a>
                <a page_number="{{ page_obj.previous_page_number }}">Last Page</a>
            {% endif %}
            {% if page_obj.has_previous or page_obj.has_next %}
                <span class="current">{{ page_obj.number }}/{{ page_obj.paginator.num_pages }}</span>
            {% endif %}
            {% if page_obj.has_next %}
                <a page_number="{{ page_obj.next_page_number }}">Next Page</a>
                <a page_number="{{ page_obj.paginator.num_pages }}">End Page</a>
            {% endif %}
        </span>
        <script type="text/javascript">
        document.querySelectorAll('.pagination a').forEach(link => {
            let page_number = link.getAttribute('page_number');
            const gotopageUrl = new URL(location.href);
            gotopageUrl.searchParams.set("page", page_number);
            link.href = gotopageUrl.href;
        });
        </script>
    </div>

相关问题