2011-10-31 8 views
8

Uczyńmy to bardzo łatwo dla moich towarzyszy (?).Czy można utworzyć niestandardowy znacznik szablonu, który zwraca zestaw zapytań? Jeśli tak, w jaki sposób? - Django

To jest jak zwykle znaczniki szablonu niestandardowego działa -

Template ->

{% block content %} 

    blah blah blah 

    {% custom_tag_load %} 

{% endblock %} 

custom_tag_load nazywa i zwraca ciąg znaków. Co chcę, aby powrócić to queryset które mógłbym użyć tak ->

{% block content %} 

    blah blah blah 

    {% for x in custom_tag_load %} 

      {{ x.datetime }} 

    {% endfor %} 

{% endblock %} 

Uwaga -> Co mam w zasadzie staramy się robić to, aby uniknąć przeniesienia queryset przez widzenia, a ja nie jestem jestem pewien, czy powinienem czuć się komfortowo, przechowując kwerendy w moim globalnym kontekście.

+0

Ten rodzaj pokonuje cały punkt MVC. To interesujące pytanie, ale ogólnie warstwa widoku nigdy nie powinna bezpośrednio pobierać danych z bazy danych. Nadal +1 za interesujące pytanie. –

+1

@Chris, to naprawdę nie jest prawda. Nie chcesz, aby twoje podstawowe obiekty pochodziły z bazy danych w szablonie, ale dodatkowe elementy - np. Pasek boczny ostatnich postów - mają sens w tagu szablonu. –

Odpowiedz

5

Możesz zwrócić wszystko, co chcesz, z tagu, w tym zapytanie. Jednak nie możesz użyć znacznika wewnątrz znacznika for - możesz tam użyć tylko zmiennej (lub zmiennej przechodzącej przez filtr). Możesz zrobić to, aby twój znacznik umieścił zestaw pytań w zmiennej w kontekście i użył tej zmiennej w pętli for. Zobacz dokumentację na stronie how to set a variable from a tag - należy jednak pamiętać, że jest to wersja rozwojowa has an easier method.

Jednak nie powinieneś również przejmować się umieszczaniem zestawu zapytań w procesorze kontekstowym. Nie zapominaj, że kwerendy są leniwy, więc nie zostanie wykonane trafienie bazy danych, chyba że zestaw kwerend zostanie oceniony lub iterowany w szablonie.

+2

Ahh, to ma sens. Dlaczego dobre rzeczy zawsze znajdują się w wersji rozwojowej? FML – Sussagittikasusa

+0

Mam to samo pytanie, ale odpowiedź niewiele mi pomogła. Trudno to zrozumieć, a link nie działa. – HBat

+0

Dla tych, którzy nie mogli zrozumieć tej odpowiedzi, sprawdź [THIS] (http://stackoverflow.com/a/12897324/2275286) dla tworzenia zmiennych kontekstowych. – HBat

2

Znacznik szablonu może zrobić, co tylko zechce. Z pseudo kod, można osiągnąć to, co trzeba ze znacznikiem inkluzji:

#my_tags.py 
from django import template 
from my_app.models import MyModel 

register = template.Library() 

@register.inclusion_tag('my_template.html') 
def my_custom_tag(): 
    things = MyModel.objects.all() 
    return {'things' : things} 


#my_template.html 
{% if things %} 
    <ul> 
    {% for thing in things %} 
     <li>{{ thing }}</li>  
    {% empty %} 
     <li>Sorry, no things yet.</li> 
    {% endfor %} 
    </ul> 
{% endif %} 


#the_view.html 
{% load my_tags %} 

{% my_custom_tag %} 

Alternatywnie, można napisać niestandardowy znacznik, który dodaje queryset do kontekstu. Mam nadzieję, że ci pomaga.

+3

Hej Brandon, to jest dokładnie to, czego chcę uniknąć, nie chcę, aby "moja_nastawnia.html" znajdowała się poza "the_view.html". Dziękuję za odpowiedź. – Sussagittikasusa

Powiązane problemy