2009-12-10 6 views
0

j'ai quelques informations définies dans les sessions, et je me demandais s'il est possible de transmettre cette information sur l'URL de la vue qui utilise ces données de session. Je veux que ce soit fonctionne de telle sorte que si l'utilisateur signets la page de ce point de vue, les données de session est utilisé pour transmettre les variables sur la vue. Comment puis-je faire ceci?données de session léguons URL

J'ai une vue de filtre ainsi je veux que les filtres actuellement sélectionnés soient montrés sur l'URL ... sortez comme www.monsite.com/filter1/filter2/filter3/ alors si le filtre2 est effacé j'aurai www. mysite.com/filter1/filter3/

Actuellement, mon URLconf pour la vue du filtre ressemble à ceci:

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

trop vague: plus de détails s'il vous plaît. –

+0

J'ai ajouté plus d'info ... laissez-moi savoir si la question est plus claire maintenant. – Stephen

Répondre

2

comme vous le dites, les données sur propagent l'URL, plutôt que dans la session. Mais utilisez la chaîne de requête - pas le chemin, comme vous semblez le suggérer dans votre question.

Il n'y a aucun moyen magique pour le faire - vous devrez ajouter manuellement les variables à toutes les urls. Vous pouvez toutefois envelopper la création d'URL dans une fonction, pour la rendre plus gérable. Par exemple .:

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

Si vous utilisez ce pour construire tous vos urls dans l'application, vous pouvez maintenant faire facilement une variable « collante ». Par exemple. en haut de votre page, vous pouvez l'utiliser comme ceci:

define_url_state('page', 1); 

Et plus bas sur la page, vous pouvez générer des urls avec url(). Vous pouvez ensuite obtenir soit la valeur par défaut (1) ou quel que soit l'utilisateur passé à $_GET de la page.

+0

Attention cependant. Il devrait y avoir une seule URL pour une ressource particulière, mais le danger avec ce que vous avez ici est que/filter1/filter2/filter3/pourrait être équivalent à/filter2/filter3/filter1 /, etc –

+0

Ce type d'information devrait faire partie de la chaîne de requête ('$ _GET') - pas le chemin. Je suis absolument d'accord là-dessus, Daniel. J'espère que l'exemple que je viens d'ajouter le rend plus clair. – troelskn

0

En django vous n'utilisez pas _GET $, mais request.GET

permet de dire votre URL est http://example.com?filter=filter1&filter=filter2&filter=filter5

vous pouvez obtenir les noms de filtre dans une vue en utilisant getlist() comme ceci:

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

de sorte que vous URL conf (urls.py) ressemblera à quelque chose comme ceci:

from django.conf.urls.defaults import * 

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

J'ai inclus le code ci-dessus dans ma vue filtre ... comment puis-je obtenir les URL à afficher? – Stephen

Questions connexes