2010-12-06 22 views
0

Mon modèle Django a un champ dans lequel je veux avoir une logique de référence. A titre d'exemple:Devrait-il aller dans la logique de vue?

This is an example of text in the field.[ref type="quotation" name="Martin" date="2010"] 

Lorsqu'ils sont présentés dans le balisage finale, cela est rendu par (exemple réduit):

This is an example of text in the field.<a href="#ref">1</a> 
[SNIP] 
<ul> 
<li><a name="ref1">Martin, 2010</a></li> 
</ul> 

Donc, essentiellement, je construis une liste de références pour aller dans un autre {{}} bloquer plus bas sur la page.

Ce type de logique de traitement de texte doit-il être présent dans la vue (donc je passe 2 valeurs au modèle, 1 au texte modifié et 1 au tableau de référence), ou y a-t-il un autre moyen Django pour le faire via des filtres, etc.?

Répondre

1

Si vous stockez réellement les références dans le champ de texte comme ceci, alors vous utilisez essentiellement un langage de balisage simple pour stocker les références.

Dans ce cas, je pense que le modèle serait l'endroit pour le faire.

Malheureusement, je ne connais aucun moyen de créer et d'écrire un filtre dans une variable de contexte. Ainsi, au lieu d'utiliser un filtre, vous allez devoir utiliser une balise, quelque chose comme:

{% output_with_references article_content myreferencesvar %} 

[snip] 

<ul> 
{% for ref in myreferencesvar %} 
<li><a name="{{ ref.id }}">{{ ref.authors }}, {{ ref.year }}</a></li> 
{% endif %} 
</ul> 

BTW: s'il est une façon d'écrire dans le contexte de la page en utilisant un filtre, je J'adore le savoir.

Mise à jour

Pour la mettre en œuvre, vous utiliseriez quelque chose comme:

from django.template import Library, Node, TemplateSyntaxError 

register = Library() 

class OutputWithReferencesNode(Node): 
    def __init__(self, input, ref_varnam='references'): 
     self.input = input 
     self.ref_varnam=ref_varnam 

    def render(self, context): 
     output = self.input 
     references = [] 
     # process self.input 
     context[self.ref_varnam] = references 
     return output 

@register.tag 
def output_with_references(parser, token): 
    try: 
     fnctn, input, ref_varname = token.split_contents() 
    except ValueError: 
     raise TemplateSyntaxError, "%s takes the syntax %s text_to_output references_variable_name" % (fnctn,) 
    return OutputWithReferencesNode(input, ref_varname) 
+0

Salut, merci pour la réponse, donc il suffit de confirmer: outputwithreferences devrait créer myreferencesvar (Argument 1 = le texte avec des balises , l'argument 2 est une nouvelle variable?), qui peut ensuite être utilisé plus loin dans la page? –

+0

Oui, un exemple de code a été ajouté. Pas testé, cependant. –

+1

Si vous n'avez pas défini une syntaxe spécifique pour votre balisage, vous pouvez envisager d'en utiliser une déjà existante (comme celle de MediaWiki http://en.wikipedia.org/wiki/Wikipedia:Citing_sources). Ensuite, vous pouvez utiliser mwlib (http://code.pediapress.com/wiki/wiki/mwlib) pour analyser le balisage. –