2011-10-31 12 views
8

Facciamo questo molto facile per i miei amici SOI (?).Puoi creare un tag modello personalizzato che restituisce un set di query? Se sì, come? - Django

Questo è come normalmente i tag di modelli personalizzati funzionano -

Template ->

{% block content %} 

    blah blah blah 

    {% custom_tag_load %} 

{% endblock %} 

Il custom_tag_load si chiama e restituisce una stringa. Quello che voglio tornare è un set di query, che avrei potuto usare come questo ->

{% block content %} 

    blah blah blah 

    {% for x in custom_tag_load %} 

      {{ x.datetime }} 

    {% endfor %} 

{% endblock %} 

Nota -> Quello che sto cercando di fare fondamentalmente è quello di evitare di passare il set di query attraverso la vista, e io non sono certo se dovrei essere a mio agio nel memorizzare querysets nel mio contesto globale.

+0

Questo tipo sconfigge l'intero punto di MVC. È una domanda interessante, ma in generale il livello di vista non dovrebbe mai mai recuperare direttamente i dati dal database. Ancora, +1 per una domanda interessante. –

+1

@ Chris, non è proprio vero. Non si desidera ottenere gli oggetti principali dal db nel modello, ma elementi ausiliari, ad esempio una barra laterale dei post recenti, ha perfettamente senso all'interno di un tag di modello. –

risposta

5

È possibile restituire qualsiasi cosa desiderata da un tag, incluso un set di query. Tuttavia, non è possibile utilizzare un tag all'interno del tag for: è possibile utilizzare solo una variabile lì (o una variabile passata attraverso un filtro). Quello che potresti fare è ottenere il tag per mettere il queryset in una variabile nel contesto, e usare quella variabile nel ciclo for. Vedere i documenti su how to set a variable from a tag - sebbene si noti che la versione di sviluppo has an easier method per farlo.

Tuttavia, non dovresti preoccuparti di inserire un queryset in un processore di contesto. Non dimenticare che i set di query sono pigri, quindi nessun hit del database verrà eseguito a meno che il queryset non venga valutato o iterato nel modello.

+2

Ah, questo ha senso. Perché le cose buone sono sempre nella versione di sviluppo? FML – Sussagittikasusa

+0

Ho la stessa domanda ma la risposta non ha aiutato molto. È difficile da capire e il collegamento non funziona. – HBat

+0

Per coloro che non sono riusciti a capire questa risposta, consulta [QUESTO] (http://stackoverflow.com/a/12897324/2275286) per creare variabili di contesto. – HBat

2

Un tag di modello può fare quello che vuoi. Dal vostro pseudo codice, si potrebbe realizzare ciò che vi serve con un tag di inclusione:

#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 %} 

In alternativa, si potrebbe scrivere un tag personalizzato che aggiunge un set di query al contesto. Spero che ciò ti aiuti.

+3

Hey Brandon, questo è esattamente il genere di cosa che voglio evitare, non voglio che "my_template.html" sia al di fuori di "the_view.html". Grazie per aver risposto. – Sussagittikasusa

Problemi correlati