将会话数据传递到URL

时间:2009-12-10 09:29:12

标签: django django-urls session-variables

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

$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";
  }
}

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

define_url_state('page', 1);

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

答案 1 :(得分:0)

在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'),
)