【问题标题】:Setting a url parameter persistently永久设置 url 参数
【发布时间】:2012-02-06 15:08:50
【问题描述】:

在我的 Django 网站中,我想通过 url 或查询字符串设置某个参数。例如。 mysite.com/?param=value。我希望这个值在设置后传递给所有视图——我可以用request.GET.get('param', 'default value')检查它。在 Django 中最简单的方法是什么?

为了更清楚,这里是一个例子 - 在我的网站的标题中,我有一个带有年份列表的下拉菜单。一旦我点击了我希望今年转移到我网站的所有其他部分的选项之一,即mysite.com/?year=1999,然后是mysite.com/somethingelse/?year=1999mysite.com/onemorething/?year=1999等等。 提前致谢。

【问题讨论】:

    标签: django django-views


    【解决方案1】:

    一种选择是将其存储在request.session 而不是request.GET。它仍然可以按照您希望的方式设置和访问:

    request.session["param"] = "my value"
    
    request.session.get('param', 'default value')
    

    有关使用会话的所有详细信息,请参阅here

    如果您特别希望在 URL 中使用它以使其透明并且用户可以更改它,则例外情况。

    ETA:您的问题的一些答案:

    1. 如果您真的想要一个 ?year=1999 URL 来在 any 视图中设置会话变量,您可以创建一个自定义 middleware 类。中间件充当过滤器,可以在 HttpRequest 到达视图之前更改它,或者更改从视图返回的 HttpResponse。在这种情况下,您可以让它检查 request.GET 并在必要时设置 request.session,然后再执行视图。请参阅文档并确保阅读有关中间件的详细信息。

    2. 将它放在 URL 中并不是一个好主意。有一些方法可以解决它,但它们很麻烦。

    3. 您可以使用RequestContextpass a request to a template 进行修改。但是你到底为什么要在那里而不是在视图函数中这样做呢?

    【讨论】:

    • +1 绝对 为此使用 request.session。在每个 URL 上添加 GET 参数非常糟糕,并且可能会破坏您的搜索引擎结果。
    • 感谢您的回答。让我澄清几点。 1. 我必须在哪里设置会话变量?理想情况下,它应该在单击带有?year=1999 部分的链接时设置,但这可能是我的任何观点,而不仅仅是一个观点。 2. 最好将这部分放在 url 中,但我可以找到解决方法,因为我有一个菜单,无论如何都会在标题中显示当前年份。 3. 我可以在模板中设置会话变量吗?
    • 1.我现在的问题是哪个更适合这个 - 上下文处理器或中间件?我正在考虑前者,因为我可以在模板中设置一个可见的变量。 2.我觉得这是一种常见的做法。 3.因为我可以在其他模板扩展的基本模板中设置它,而不是修改我拥有的每个视图(我有一些)。目前,我看到它的方式是:1.创建具有类似 ?year=1999 的链接 2.Check request.GET 用于上下文处理器或中间件中的 year3.Setrequest.session['year'] 4.传递此值以在模板中使用。
    • 1.您对上下文处理器提出了很好的看法。这是比中间件更好的选择。 2.这取决于您的站点有多复杂以及参数对它的重要性。 3.该值当然应该在模板中使用,但正如您所说,它应该在上下文处理器中设置。
    • 上下文处理器方法不起作用,因为它似乎是在视图函数之后调用的,但我需要在视图中有参数值所以我必须使用中间件。 .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 2013-12-20
    • 2014-01-25
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    相关资源
    最近更新 更多