2010-02-14 4 views
3

Je suis en train d'utiliser un modèle qui contient un lien comme celui-ci:Django: alias URL dynamique dans les modèles

<a href="{% url search query,page.previous_page_number %}">previous</a> 

Je suis en train de l'utiliser dans de multiples contextes; En d'autres termes, l'alias de l'URL "recherche" doit pointer vers une cible différente, en fonction de la vue qui affiche le modèle.

est-il un moyen de passer un tel alias au modèle, de sorte que les éléments suivants (ou similaire) fonctionne ?:

direct_to_template(request, 'my_template.html', {'search': my_url_alias}) 

Répondre

2

Pour autant que je sache, vous ne pouvez pas, parce que, pour Si je ne comprends pas, la balise url ne prend pas de chaîne comme argument d'entrée. Ce que vous avez à faire est de déployer votre propre balise de template, basée sur l'implémentation du url templatetag dans django, en utilisant une variable comme premier argument.

J'utilise quelque chose comme ça (nommez-le comme vous le souhaitez):

class NavUrlNode(Node): 

    def __init__(self, *args): 
     self.name_var = Variable(args[0]) 
     self.args=[] 
     for ii in range(1,args.__len__()): 
      self.args.append(Variable(args[ii])) 

    def render(self, context): 
     name = self.name_var.resolve(context) 
     args=[] 
     for ii in range(self.args.__len__()): 
      args.append(self.args[ii].resolve(context)) 
     return reverse(name, args=args) 


@register.tag 
def navigation_url(parser, token): 
    args = token.split_contents() 
    return NavUrlNode(*args[1:]) 
+0

Excellent! Merci. Notez que plusieurs arguments ne fonctionneront pas dans votre solution, cependant. J'ajouterai une autre réponse qui corrige ces problèmes (et j'espère que cela rendra les choses un peu plus simples). – knipknap

+0

merci cela a été utile :) –

1

Voici une légère amélioration par rapport à la solution d'Olivier:

from django.template   import Library, Node, Variable 
from django.core.urlresolvers import reverse 

register = Library() 

class DynUrlNode(Node): 
    def __init__(self, *args): 
     self.name_var = Variable(args[0]) 
     self.args  = [Variable(a) for a in args[1].split(',')] 

    def render(self, context): 
     name = self.name_var.resolve(context) 
     args = [a.resolve(context) for a in self.args] 
     return reverse(name, args = args) 

@register.tag 
def dynurl(parser, token): 
    args = token.split_contents() 
    return DynUrlNode(*args[1:]) 
0

solution de knipknap m'a beaucoup aidé, mais il y a un peu défaut: Une erreur d'index est déclenchée chaque fois que vous ne passez aucun argument. Pour y remédier, il suffit de remplacer le constructeur de la DynUrlNode avec les éléments suivants:

def __init__(self, *args): 
    self.name_var = Variable(args[0]) 
    try: 
     self.args  = [Variable(a) for a in args[1].split(',')] 
    except IndexError: 
     self.args = [] 
Questions connexes