【问题标题】:Pass session data onto URL将会话数据传递到 URL
【发布时间】:2009-12-10 09:29:11
【问题描述】:

我在会话中设置了一些信息,我想知道是否可以将此信息传递到使用此会话数据的视图的 URL 上。我希望它的工作方式是,如果用户从该视图中为页面添加书签,则会话数据用于将变量传递到视图上。我该怎么做?

我有一个过滤器视图,所以我希望在 URL 上显示当前选择的过滤器......有点像 www.mysite.com/filter1/filter2/filter3/ 然后如果 filter2 被清除,我将拥有 www.mysite .com/filter1/filter3/

目前我的过滤视图的 URLConf 如下所示:

(r'^filter/$', 'filter'),
(r'^filter/(?P<p>\d{2})/$', 'filter'),

【问题讨论】:

  • 太模糊了:请提供更多细节。
  • 我添加了更多信息...如果问题现在更清楚了,请告诉我。

标签: django django-urls session-variables


【解决方案1】:

正如您所说,在 url 上而不是在会话中传播数据。但使用查询字符串 - 而不是路径,正如您在问题中所建议的那样。

没有神奇的方法可以做到这一点 - 您必须手动将变量附加到所有 url。但是,您可以将 url-creation 包装在一个函数中,以使其更易于管理。例如:

$GLOBALS['url_state'] = array();

function url($base, $params = array()) {
  global $url_state;
  $q = http_build_query(array_merge((array) $url_state, $params));
  return $q ? "$base?$q" : $base;
}

function define_url_state($name, $default = null) {
  global $url_state;
  if (isset($_GET[$name])) {
    $url_state[$name] = $_GET[$name];
  } elseif ($default !== null) {
    $url_state[$name] = "$default";
  }
}

如果您使用它来构建应用程序中的所有 url,您现在可以轻松地将变量设置为“粘性”。例如。在页面顶部,您可以像这样使用它:

define_url_state('page', 1);

在页面的下方,您可以生成带有url() 的网址。然后,您将获得默认值 (1) 或用户传递给页面的 $_GET 的任何值。

【讨论】:

  • 不过要小心。一个特定的资源应该只有一个 URL,但这里的危险是 /filter1/filter2/filter3/ 可能等同于 /filter2/filter3/filter1/ 等。
  • 这种信息应该是查询字符串 ($_GET) 的一部分,而不是路径。我完全同意这一点,丹尼尔。希望我刚刚添加的示例能更清楚地说明这一点。
【解决方案2】:

在 django 中你不使用 $_GET,而是 request.GET

假设你的网址是http://example.com?filter=filter1&filter=filter2&filter=filter5

您可以像这样使用getlist() 在视图中获取过滤器名称:

def some_view(request):
    filters = request.GET.getlist('filter')

所以你的 URL conf (urls.py) 看起来像这样:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    url(r'^filters/$', 'your_app.views.some_view', name='filter_view'),
)

【讨论】:

  • 我已经在我的过滤器视图中包含了上面的代码...如何让 URL 显示出来?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 2016-11-15
  • 2016-11-22
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
相关资源
最近更新 更多