2013-06-03 6 views
8

Ich hätte gerne einen Rat bei der Konstruktion von Django Vorlagen Ebenen.Django Vorlage Vererbung: Wie viele Ebenen und welche Seite zu rendern

Lesen der Dokumente, ich verstehe nicht, wie Sie eine Vorlage Hierarchie Struktur mit mehr als 2 Ebenen erstellen.

Zum Beispiel würde Ich mag 3 Ebenen der Vererbung erstellen:

base.html 
    └── base_level2.html 
      ├── level2_level3_1.html 
      └── level2_level3_2.html 

Dies ist mein Code:

  • base.html

    First level 
    {% block level2 %}{% endblock %} 
    
  • base_level2.html

    {% extends "base.html" %} 
    {% block level2 %} 
        Second level 
        {% block level3_1 %}{% endblock %} 
        {% block level3_2 %}{% endblock %} 
    {% endblock %} 
    
  • level2_level3_1.html

    {% extends "base_level2.html" %} 
    {% block level3_1 %} 
        Third level, part 1 
    {% endblock %} 
    
  • level2_level3_2.html

    {% extends "base_level2.html" %} 
    {% block level3_2 %} 
        Third level, part 2 
    {% endblock %} 
    
  • views.py:

    def myView(request): 
        return render_to_response('level2_level3_1.html', {}, context_instance=RequestContext(request)) 
    

Auf diese Weise ich folgendes sehen Mein Browser:

First level 
Second level 
Third level, part 1 

Und das ist mir logisch, weil ich render_to response nur auf level2_level3_1.html nennen.

Natürlich, wenn Anruf level2_level3_2.html, bekomme ich die Nachricht Third level, part 2, aber nicht die Third level, part1.

Wie löst man das? Ist das ein guter Ansatz? Ich habe Sachen auf diese Weise strukturiert, weil meine echten Vorlagen sehr groß sind, viele Zeilen Code, also würde ich gerne etwas Ordnung behalten. Jeder Rat wird geschätzt.

+0

Was ist das Problem? Möchtest du "Drittes Niveau, Teil 1" und "Drittes Niveau, Teil 2" haben? Warum können Sie nicht beide Teile auf die gleiche Seite setzen? Sie gehören zu zwei verschiedenen Blöcken. – EsseTi

+0

Wie ich oben sagte "Ich habe Sachen auf diese Weise strukturiert, weil meine echten Vorlagen sehr groß sind ...". Dies ist ein minimales Beispiel, aber meine level2_level3_1.html und level2_level3_2.html sind in Wirklichkeit sehr lang und ich möchte sie nicht in einer großen einzelnen Datei zusammenführen. – caneta

Antwort

6

Es ist schwer zu sagen, ob es eine gute oder schlechte Idee ist oder nicht, ohne die spezifische Funktionalität Ihrer Vorlagen zu kennen, aber meine unmittelbare Reaktion ist, dass Sie versuchen, Ihre Vorlagen zu organisieren. Ich denke, die meisten Leute würden Sie von mehr als einem 3-Tier-System abhalten, weil es es schwieriger macht, kleine Änderungen an der Website vorzunehmen und schwieriger zu verfolgen, wo die Dinge liegen. vom Zen von Python:

Wohnung ist besser als Nested

Die Empfehlung für ein System 3-Tier in Two Scoops of Django geht so:

  1. Jede App eine base_<app_name>.html hat Vorlage. Basisvorlagen auf App-Ebene teilen sich ein gemeinsames Elternteil, base.html.
  2. Vorlagen in Apps teilen sich ein gemeinsames Elternteil base_ <app_name> .html Vorlage.
  3. Jede Vorlage auf dem gleichen Niveau wie base.html erbt base.html

und für Ihr Namensschema, könnte es so aussehen:

| Templates/ 
    |--base.html 
    |--someothertemplate.html # extends base.html 
    |--level2/ 
    |----base_level2.html  # extends base.html 
    |----level2_1.html  # extends base_level2.html 
    |----level2_2.html  # extends base_level3.html 

EDIT: und es gibt keine wirklichen Grund dafür:

Second level 
    {% block level3_1 %}{% endblock %} 
    {% block level3_2 %}{% endblock %} 

wobei sich jeder Block auf den Inhalt einer Vorlage bezieht. Sie können, dass wie

{% block level3 %}{% endblock level3%} 

auf einen Block vereinfachen und dann in jedem der level3 Vorlagen entsprechend die Blöcke umbenennen

+0

Ok, also keine Möglichkeit Split Level3, auch wenn es Tausende von Zeilen lang ist? – caneta

+0

Können Sie erklären, was Sie mit "Split Level" meinen? Werden diese Levels auf derselben Seite angezeigt? und du versuchst nur deine Seite zu zerhacken, damit es leichter zu verwalten ist? Wenn Ihre Vorlage Tausende von Zeilen lang ist, tun Sie wahrscheinlich etwas falsch. Sie sollten Code schreiben, der HTML für Sie generiert. – skzryzg

+0

Es ist nicht "Split-Level", aber wie teilt man ................ level3. Ja, diese Ebenen werden auf der gleichen Seite angezeigt, wie im Beispiel gezeigt. Ja, ich möchte meine Seite zerhacken, damit sie einfacher zu verwalten ist. Meine Vorlage ist tausende Zeilen lang, weil sie sehr umfangreich und kompliziert ist, nicht weil ich keine Django-Funktionen, Template-Tags und so weiter verwende ... – caneta

3

Wahrscheinlich nicht der beste Weg, es zu tun, aber sie könnte Benutzer includehttps://docs.djangoproject.com/en/dev/ref/templates/builtins/#include

so etwas wie dies für base_level2.html

{% extends "base.html" %} 
{% block level2 %} 
Second level 
{% include "level2_level3_1.html" %} 
{% include "level2_level3_2.html" %} 
{% endblock %} 

ich dies nicht getestet haben, also nicht sicher, dass es funktioniert.

und btw:

Die Include-Tag sollte als Implementierung „machen dieses Subtemplate und schließen die HTML“, nicht als „analysieren diese Subtemplate führen und deren Inhalt in Betracht gezogen werden, als ob sie waren Teil der Elternteil". Dies bedeutet, dass es keinen gemeinsamen Status zwischen den enthaltenen Vorlagen gibt - jedes Include ist ein vollständig unabhängiger Renderprozess.

+0

Ja, es ist für diese Klausel, dass ich das Include-Tag nicht verwendet habe. – caneta

+0

aber es sollte tun, was Sie brauchen, können Sie sogar Parameter übergeben. – EsseTi

+0

Ok, ich werde es versuchen, danke! – caneta