Django-fr

Forum

#1 28-09-2015 15:07:53

Napoleon
Membre
Inscription : 27-08-2015
Messages : 16

Créer un tag qui retourne du code html

Bonjour !

Bon pour une fois je ne viens pas ici avec un probleme smile Mais une question !

Enfaite, j'aimerais savoir si il etait possible de créer un tag qui a pour valeur retour du code HTML qui viendrait s'ajouter au HTML déja présent dans notre template ?

Bonne journée,

Hors ligne

#2 28-09-2015 16:07:19

Xavier Ordoquy
Administrateur
Lieu : Puteaux, France
Inscription : 12-10-2011
Messages : 312
Site Web

Re : Créer un tag qui retourne du code html

C'est tout à fait possible via les tags par défaut. Il faut peut-être marquer le HTML comme étant safe pour éviter l'échappement automatique.

Hors ligne

#3 29-09-2015 14:43:09

Napoleon
Membre
Inscription : 27-08-2015
Messages : 16

Re : Créer un tag qui retourne du code html

Re-Bonjour !  smile


Bon ma question c'est donc transformée en problème hmm Cependant je pense pas que ce soit un réel problème car a mon avis mon code marche. Je pense que c'est plus lié a un manque de connaissances de ma part. Je m'explique:

Je veux que pour mon site pour le header certains onglets s'affiche / ou ne s'affiche pas en fonction de la date. Pour cela je suis allé voir du côté des tags personalisés et j'ai créer le mien. Son fonctionnement est simple, Si la date du jour se trouve être pendant la période ou je veux que mon onglet s'affiche je renvoi un code html faisant apparaitre mon onglet, sinon je ne le fais pas.

Voici le code de mon tag:

@register.tag
def onglet_html_tag(parser, token):

    try:
        nom_tag = token.split_contents()
    except ValueError:
        msg = 'The tag %s have a error' % token.split_contents()[0]
        raise template.TemplateSyntaxError(msg)
    return onglet_html_node()

class onglet_html_node(template.Node):

    def render(self, context):

    opt1 = "<li><a href={% url 'proposal:newProposal' %}>New Proposal</a></li>\n<li><a href={% url \
'proposal:proposalStatus' %}>My Proposals</a></li>"
    opt2 = "<li><a href={% url 'proposal:proposalStatus' %}>My Proposals</a></li>"

    today = datetime.now()

    if today < settings.END_CALL and today > settings.START_CALL:
            return mark_safe(opt1)
        else:                                                                                           
            return mark_safe(opt2)

et celui de la partie de mon template concerné:

<li class="dropdown">
                          <a href="#" class="dropdown-toggle" data-toggle="dropdown"
                             role="button" aria-expanded="false">Proposal<span class="caret"></span></a>
                          <ul class="dropdown-menu" role="menu">
                              {% onglet_html_tag %}
                          </ul>
                      </li><!-- dropdown Proposal -->

Voici mon probleme maintenant:

Effectivement maintenant quand je ne suis pas dans la  bonne période, seul mon onglet  my_proposal s'affiche et pas l'onglet new_proposal. Seulement, maintenant quand je clique sur un de mes onglet, l'url auquel Django cherche a accéder n'est plus quelque chose comme /CTAproposal/new_proposal mais quelque chose comme /CTAproposal/%7B% (d'ailleurs il me semble que ce n'est pas forcément %7B%, j'ai l'impression que ca change a des fois). Du coup, mon url ne correspond plus avec les urls de urls.py.
Alors, pourquoi mes urls ont-elles changées ? Comment trouver une solution a ce probleme ?

Hors ligne

#4 06-10-2015 14:37:33

Napoleon
Membre
Inscription : 27-08-2015
Messages : 16

Re : Créer un tag qui retourne du code html

Re-bonjour.

Bon, personne ne m'a répondu sur ce sujet mais peut-etre la solution que j'ai trouvée intéressera et aidera quelqu'un un jour.

Alors au final, voila comment j'ai procédé, mon tag personnalisé maintenant au lieu de retourner du code HTML retourne une variable dans le context de mon template ( égale a 0 ou a 1).

Et dans mon template en fonction de la valeur de ma nouvelle variable j'execute tel ou tel partie du code en HTML. Comme ceci :

{% onglet_html_tag %}
                          {% if open_call == 1 %}
                          <ul class="dropdown-menu" role="menu">
                            <li><a href={% url 'proposal:newProposal' %}>New Proposal</a></li>
                            <li><a href={% url 'proposal:proposalStatus' %}>My Proposals</a></li>
                          </ul>
                          {% else %}
                          <ul class="dropdown-menu" role="menu">
                            <li><a href={% url 'proposal:proposalStatus' %}>My Proposals</a></li>
                          </ul>
                          {% endif %}
@register.tag()
def onglet_html_tag(parser, token):

    try:
        nom_tag = token.split_contents()
    except ValueError:
        msg = 'The tag %s have a error' % token.split_contents()[0]
        raise template.TemplateSyntaxError(msg)
    return onglet_html_node()

class onglet_html_node(template.Node):

    def render(self, context):

        today = datetime.now()

        if today < settings.END_CALL and today > settings.START_CALL:
            context['open_call'] = 1
        else:
            context['open_call'] = 0
        return ''

Je sais pas si c'est la solution la plus propre de la Terre, mais ca a le mérite de fonctionner.

Ciao

Hors ligne

Pied de page des forums