2009-12-10 2 views
0

У меня есть информация, которая задана в сеансах, и мне было интересно, можно ли передавать эту информацию на URL-адрес представления, использующего данные сеанса. Я хочу, чтобы это работало таким образом, что если пользователь закладок страницы из этого представления, данные сеанса используются для передачи переменных в представление. Как я могу это сделать?Передайте данные сеанса на URL-адрес

У меня есть вид фильтра, поэтому я хочу, чтобы выбранные фильтры отображались в URL-адресе ... sorta like www.mysite.com/filter1/filter2/filter3/, а затем, если filter2 очищен, у меня будет www. mysite.com/filter1/filter3/

в настоящее время мой привязок для вида фильтра выглядит следующим образом:

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

Слишком расплывчато: подробнее пожалуйста. –

+0

Я добавил дополнительную информацию ... дайте мне знать, если вопрос станет яснее. – Stephen

ответ

2

Как вы говорите, распространять данные на URL, а не на сессии. Но используйте строку запроса - не путь, как вы, кажется, предлагаете в своем вопросе.

Существует не волшебный способ сделать это - вам придется вручную добавить переменные ко всем URL-адресам. Однако вы можете обернуть создание 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); 

А дальше вниз страницы, вы можете создать URLs с url(). Затем вы получите либо значение по умолчанию (1), либо любое другое, которое пользователь передал на страницу $_GET.

+0

Будьте осторожны. Для конкретного ресурса должен быть только один URL, но опасность с тем, что у вас здесь, это то, что/filter1/filter2/filter3/может быть эквивалентно/filter2/filter3/filter1/и т. Д. –

+0

Такая информация должна быть частью строки запроса ('$ _GET') - не путь. Я абсолютно согласен с этим, Даниэль. Надеюсь, пример, который я только что добавил, делает это более ясным. – troelskn

0

В Джанго вы не используете $ _GET, но request.GET

позволяет сказать, что ваш URL является http://example.com?filter=filter1&filter=filter2&filter=filter5

вы можете получить имена фильтров в целях использования getlist() так:

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

таким образом, вы URL конф (urls.py) будет выглядеть примерно так:

from django.conf.urls.defaults import * 

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

Я включил приведенный выше код в свой экран фильтра ... как получить URL-адреса для отображения? – Stephen