2010-10-14 3 views
9

Actuellementmodèle choisir Dynamiquement pour la balise d'inclusion django

J'ai une étiquette d'inclusion qui est codé quelque chose comme ceci:

@register.inclusion_tag('forms/my_insert.html', takes_context=True) 
def my_insert(context): 
    # set up some other variables for the context 
    return context 

Dans mon modèle, je l'inclure en mettant en {% my_insert %}

Nouvelle demande de fonctionnalité

Nous voulons maintenant tester une nouvelle mise en page - c'est juste un changement au modèle, pas de changement aux variables de contexte. J'accomplir cela en appelant la première

@register.inclusion_tag('forms/my_new_insert.html', takes_context=True) 
def my_new_insert(context): 
    return my_insert(context) 

Pour utiliser le nouveau modèle, je dois utiliser:

{% ifequal some_var 0 %} 
    {% my_insert %} 
{% endifequal %} 
{% ifnotequal some_var 0 %} 
    {% my_new_insert %} 
{% endifnotequal %} 

La question

Est-il possible de choisir le modèle dans la fonction qui configure le contexte de balise template?

Je imagine il pourrait être quelque chose comme:

@register.inclusion_tag('forms/my_insert.html', takes_context=True) 
def my_insert(context): 
    # set up some other variables for the context 
    if context['some_var'] == 0: 
     context['template'] = 'forms/my_insert.html' 
    else: 
     context['template'] = 'forms/my_new_insert.html' 
    return context 

Répondre

1

Vous devez créer votre propre étiquette personnalisée, avec le paramètre qui sera votre modèle. Où est impossible d'utiliser l'étiquette d'inclusion avec plusieurs modèles.

0

Essayez ceci:

@register.inclusion_tag('include/dummy.html') 
def my_new_insert(template='forms/my_insert.html'): 
    return {'template': template, 
      'myvar': Myobject.objects.all()} 

et jeter un oeil à django documentation

+0

Cela ne fonctionne pas quand je l'ai essayé. Je ne vois aucune indication que cela devrait dans la documentation que vous avez liée. – mqsoh

+1

Cela fonctionne pour moi. Django 1.9 – Sharmila

3

je devais gérer même question ci-dessus et je résolus comme ceci:

dummy.html

{% extends template %} 

mytags.py

from django.template import Library 

register = Library() 

@register.inclusion_tag('dummy.html') 
def render_sample(template='default.html'): 
    return {'template': template} 

layout.html

{% load mytags %} 

{% render_sample template="another_template.html" 
Questions connexes