2010-04-19 10 views
1

Quelqu'un peut-il m'aider à trouver un moyen d'obtenir ce qui suit (voir les extraits ci-dessous) dans les modèles Django? Je sais que vous ne pouvez pas utiliser plus d'une extension, mais je suis nouveau à django et je ne connais pas la syntaxe appropriée pour quelque chose comme ça. Je veux pouvoir faire ceci pour que je puisse utiliser ma disposition div imbriquée pour des raisons css sans avoir à le taper comme ça à chaque fois et risquer une faute de frappe. En mots, je veux pouvoir avoir un modèle de page étendre mon fichier base.html, puis utiliser des extraits HTML du contenu du modèle dynamique (ie modèle pour les boucles ou d'autres périphériques logiques, pas seulement une variable de contexte que j'ai définie depuis mon contrôleur de vue).Comment puis-je utiliser des extraits de bloc html avec du contenu dynamique dans un modèle django qui étend un autre fichier?


modifier: Je veux être en mesure d'afficher un contenu arbitraire de façon arbitraire dans chaque colonne. Par exemple, j'aimerais pouvoir afficher un ul d'images dans une colonne puis, sur la même page, afficher un autre ensemble de colonnes affichant une table de données. Voici un exemple que je tapé: example of alot of random columns


Je me rends compte que l'image exemple a tout le texte généré à partir de la sortie du testeur web django mais chaque coulmn devrait être en mesure d'avoir un contenu aléatoire. Et ils devraient être imbriqués. Est-ce possible avec le langage de template django par défaut?

------------------------------------------------------------ 
base.html 
------------------------------------------------------------ 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> 
     <title>{% block title %}Title{% endblock %}</title> 
    </head> 
    <body> 
     <div class="wrapper"> 
      <div class="header"> 
       This is the common header 
      </div> 
      <div class="nav"> 
       This is the common nav    
      </div> 
      {% if messages %} 
       <div class="messages"> 
        <ul> 
         {% for message in messages %} 
         <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> 
         {% endfor %} 
        </ul> 
       </div> 
      {% endif %} 
      <div class="content"> 
       {% block content %}Page Content{% endblock %} 
      </div> 
      <div class="footer"> 
       This is the common footer 
      </div> 
     </div> 
    </body> 
</html> 
------------------------------------------------------------ 
columnlayout2.html 
------------------------------------------------------------ 
<div class="twocol container2"> 
    <div class="container1"> 
     <div class="col1"> 
      {% block twocol_col1 %}{% endblock %} 
     </div> 
     <div class="col2"> 
      {% block twocol_col2 %}{% endblock %} 
     </div> 
    </div> 
</div> 

------------------------------------------------------------ 
columnlayout3.html 
------------------------------------------------------------ 
<div class="threecol container3"> 
    <div class="container2"> 
     <div class="container1"> 
      <div class="col1"> 
       {% block threecol_col1 %}{% endblock %} 
      </div> 
      <div class="col2"> 
       {% block threecol_col2 %}{% endblock %} 
      </div> 
      <div class="col3"> 
       {% block threecol_col3 %}{% endblock %} 
      </div> 
     </div> 
    </div> 
</div> 

------------------------------------------------------------ 
page.html 
------------------------------------------------------------ 
{% extends "base.html" %} 

{% block content %} 

    {% extends "columnlayout2.html" %} 
     {% block twocol_col1 %}twocolumn column 1{% endblock %} 
     {% block twocol_col2 %}twocolumn column 2{% endblock %} 

    {% extends "columnlayout3.html" %} 
     {% block threecol_col1 %}threecol column 1{% endblock %} 
     {% block threecol_col2 %}threecol column 2{% endblock %} 
     {% block threecol_col3 %}threecol column 3{% endblock %} 

{% endblock %} 

------------------------------------------------------------ 
page.html output 
------------------------------------------------------------ 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> 
     <title>Title</title> 
    </head> 
    <body> 
     <div class="wrapper"> 
      <div class="header"> 
       This is the common header 
      </div> 
      <div class="nav"> 
       This is the common nav    
      </div> 
      <div class="content"> 
       <div class="twocol container2"> 
        <div class="container1"> 
         <div class="col1"> 
          twocolumn column 1 
         </div> 
         <div class="col2"> 
          twocolumn column 2 
         </div> 
        </div> 
       </div> 
       <div class="threecol container3"> 
        <div class="container2"> 
         <div class="container1"> 
          <div class="col1"> 
           threecol column 1 
          </div> 
          <div class="col2"> 
           threecol column 2 
          </div> 
          <div class="col3"> 
           threecol column 3 
          </div> 
         </div> 
        </div> 
       </div> 
      </div> 
      <div class="footer"> 
       This is the common footer 
      </div> 
     </div> 
    </body> 
</html> 
+0

On dirait que [tags d'inclusion] (http://docs.djangoproject.com/fr/1.1/howto/custom-template-tags/#inclusion-tags) sont ce que vous recherchez. –

Répondre

1

Je suis d'accord avec Daniel, les balises d'inclusion sont probablement ce que vous êtes après et je pense que vous les malentendus et de {% extends %}.

Si votre contenu est statique ou dans le contexte, vous pouvez utiliser {% include%} blocs comme

{% block content %} 
    {% include "columnlayout2.html" %} 
    {% include "columnlayout3.html" %} 
{% endblock %} 

vous pouvez donc stocker le contenu que vous voulez quelque chose comme {{two_columns}} et {{ three_columns}} et rendre

------------------------------------------------------------ 
columnlayout2.html 
------------------------------------------------------------ 
<div class="twocol container2"> 
    <div class="container1"> 
     <div class="col1"> 
      {{ two_columns[0] }} 
     </div> 
     <div class="col2"> 
      {{ two_columns[1] }} 
     </div> 
    </div> 
</div> 

Ou vous pouvez utiliser des balises d'inclusion dans page.html

EDIT

Le modérateur a besoin de rendre le HTML avec une structure différente (pas seulement le contenu) sur des pages différentes, de sorte que vous pouvez faire quelque chose comme "imbriquer" des appels de balises d'inclusion.

{% block content %} 
    {% show_two_columns two_columns %} 
    {% show_three_columns three_columns %} 
{% endblock %} 

templatetag

@register.inclusion_tag("columns/two_columns.html") 
def show_two_columns(columns): 
    return {'columns': columns} 

two_columns.html

<div class="twocol container2"> 
    <div class="container1"> 
     <div class="col1"> 
      {% render_column columns[0] %} 
     </div> 
     <div class="col2"> 
      {% render_column columns[1] %} 
     </div> 
    </div> 
</div> 

et vous pouvez faire tout ce que la logique dont vous avez besoin de changer ce que vous voulez afficher dans la balise d'inclusion render_column et le modèle qu'il les usages. J'aimerais pouvoir en dire plus, mais c'est assez spécifique au contenu de la colonne et à sa différence dans chaque cas.

+0

Okay. J'ai marqué cela comme la réponse. Comment manipulez-vous la liste/l'ensemble de requêtes/données que vous transmettez via le filtre d'inclusion dans le fichier page.html? Je souhaite pouvoir utiliser les fragments de colonne dans plusieurs modèles de page différents, de sorte que les données transmises via le filtre d'inclusion doivent déjà être formatées en HTML. – user319862

+0

Ah je vois. Il est vrai que vous ne voulez pas créer de code HTML dans vos vues. Le HTML est-il complètement différent à chaque fois? –

+0

Oui c'est ... =/c'est ce qui me donne des maux de tête. – user319862