2017-06-19 6 views
0

Ich habe eine funktionierende Lösung für eine Vorlage, die optionale Sidebars ermöglicht. Abhängig von den vom Benutzer gewählten Optionen; signifikante DOM-Manipulationen treten auf.Django - Generalisieren einer Vorlage mit optionaler Sidebar

Die Arbeitslösung ist unnötig groß und bietet einige Code-Duplizierung. Es erstreckt sich auch nicht gut.

Ich bin auf der Suche nach einer viel allgemeineren Lösung. Eine, die eine einfachere Erweiterung oder Zusammenfassung ermöglicht, damit ich mich nicht für jede Seite mit einer Seitenleiste wiederholen muss.

Die Arbeitslösung

{% extends "app/base.html" %} 

{% load wagtailcore_tags %} 

{% block content %} 
    {% if self.sidebar == "left" %} 
     <div class="row"> 
      <div class="4u 12u(mobile)"> 
       {% include "app/includes/sidebar.html" with sidebar_items=self.sidebar_items.all %} 
      </div> 
      <div class="8u 12u(mobile) important(mobile)"> 
       <article class="box post"> 
        {% include "app/includes/banner.html" with feed_image=self.feed_image only %} 
        {{ self.body|richtext }} 
        {% include "app/includes/related_links.html" with related_links=self.related_links.all only %} 
       </article> 
      </div> 
     </div> 
    {% elif self.sidebar == "right" %} 
     <div class="row"> 
      <div class="8u 12u(mobile)"> 
       <article class="box post"> 
        {% include "app/includes/banner.html" with feed_image=self.feed_image only %} 
        {{ self.body|richtext }} 
        {% include "app/includes/related_links.html" with related_links=self.related_links.all only %} 
       </article> 
      </div> 
      <div class="4u 12u(mobile)"> 
       {% include "app/includes/sidebar.html" with sidebar_items=self.sidebar_items.all %} 
      </div> 
     </div> 
    {% else %} 
     <article class="box post"> 
      {% include "app/includes/banner.html" with feed_image=self.feed_image only %} 
      {{ self.body|richtext }} 
      {% include "app/includes/related_links.html" with related_links=self.related_links.all only %} 
     </article> 
    {% endif %} 
{% endblock %} 

{% block content %} zuerst hier in app/base.html definiert:

<div id="main-wrapper"> 
     <div class="container"> 
      <!-- <article class="box post"> --> 
       {% block content %}{% endblock %} 
       <!-- {% include 'app/includes/prev_next.html' %} --> 
      <!-- </article> --> 
     </div> 
    </div> 

Und sidebar.html sieht wie folgt aus:

{% load wagtailimages_tags %} 
{% for sidebar_item in sidebar_items %} 
    <section class="box"> 
     {% image sidebar_item.image original as img %} 
     <a href="{{ sidebar_item.link }}"" class="image featured"><img src="{{ img.url }}" alt="" /></a> 
     <header> 
      <h3>{{ sidebar_item.title }}</h3> 
     </header> 
     <p>{{ sidebar_item.body }}</p> 
     {% if sidebar_item.button_text %} 
      <footer> 
       <a href="{{ sidebar_item.link }}" class="button alt">{{ sidebar_item.button_text }}</a> 
      </footer> 
     {% endif %} 
    </section> 
{% endfor %} 

Mein erster Versuch, es zu verallgemeinern war zu versuchen Sie, alle Bedingungen in app/base.html zu tun, aber ich konfrontiert Probleme, wenn es sich um die Position {{ block content }}.

Jede Hilfe sehr geschätzt.

Antwort

1

Wenn die Bedingung zur Entscheidung über den Typ der Seitenleiste von der Funktion views.py, die die Seite bedient, entschieden und geliefert wird, wäre der beste Ansatz, einfach verschiedene Vorlagen für jede andere Seite zu erstellen.

Diese Lösung klingt übermäßig einfach, aber wenn sie richtig modularisiert ist (in Bezug auf den gesamten Code, der in einer Basisdatei gespeichert und bei Bedarf erweitert wird), wäre dies der beste Ansatz. Auch wenn sich die Anzahl der anderen Vorlagen erhöhen könnte, führt dies zu kürzeren Ladezeiten aufgrund kleinerer HTML-Snippets.

Wenn Sie nicht möchten, dass die bedingten Entscheidungen von views.py gehandhabt werden, können Sie alternativ AJAX verwenden und die angezeigte Vorlage asynchron ändern, ohne ein erneutes Laden zu verursachen.

Hoffe, das hilft!

+0

Interessant, was Sie über die Ladezeiten sagen. Ich habe es ursprünglich ausgeschlossen, die Anzahl der Vorlagen zu reduzieren, aber ich muss es vielleicht noch einmal überdenken. Vielen Dank für Ihre Antwort. –

Verwandte Themen