views:

70

answers:

2

I have some information that is set in the sessions, and I was wondering if it's possible to pass this info onto the URL for the view that uses this session data. I want this to be working in such a way that if the user bookmarks the page from that view, the session data is used to pass the variables onto the view. How can I do this?

I'm having a filter view so I want the currently selected filters displayed on the URL...sorta like www.mysite.com/filter1/filter2/filter3/ then if filter2 is cleared I'll have www.mysite.com/filter1/filter3/

Currently my URLConf for the filter view looks like this:

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

As you say, propagate the data on the url, rather than in session. But use the query-string - not the path, as you seem to suggest in your question.

There is no magic way to do this - you'll have to manually append the variables to all urls. You can however wrap the url-creation in a function, to make this more manageable. Eg.:

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

If you use this to build all your urls in the application, you can now easily make a variable "sticky". Eg. at the top of your page, you could use it like this:

define_url_state('page', 1);

And further down the page, you can generate urls with url(). You would then get either the default value (1) or whatever the user passed to the page's $_GET.

troelskn
Be careful though. There should be only one URL for a particular resource, but the danger with what you have here is that /filter1/filter2/filter3/ could be equivalent to /filter2/filter3/filter1/, etc.
Daniel Roseman
This kind of information should be part of the query-string (`$_GET`) - not the path. I absolutely agree on that, Daniel. Hopefully the example I just added makes that clearer.
troelskn
A: 

In django you don't use $_GET, but request.GET

lets say your url is http://example.com?filter=filter1&amp;filter=filter2&amp;filter=filter5

you can get the filter names in a view using getlist() like this:

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

so you URL conf (urls.py) will look something like this:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    url(r'^filters/$', 'your_app.views.some_view', name='filter_view'),
)
Jiaaro
I've included the above code in my filter view...how do I get the URLs to be displayed?
Stephen