Numerico per loop nei template di Django

Come posso scrivere un numero for ciclo in un modello Django? Intendo qualcosa del genere

 for i = 1 to n 

Ho usato una tecnica semplice che funziona bene per piccoli casi senza tag speciali e senza contesto aggiuntivo. A volte questo è utile

 {% for i in "xxxxxxxxxxxxxxxxxxxx" %} {{ forloop.counter0 }} {% endfor %} 

Regola la lunghezza di “xxxxxxxxxxxxxxxxxxx” in base alle tue esigenze. “xxx” per fare solo 3 iterazioni, ecc.

Sfortunatamente, questo non è supportato nel linguaggio template di Django. Ci sono un paio di suggerimenti , ma sembrano un po ‘complessi. Vorrei solo inserire una variabile nel contesto:

 ... render_to_response('foo.html', {..., 'range': range(10), ...}, ...) ... 

e nel modello:

 {% for i in range %} ... {% endfor %} 
 {% with ''|center:n as range %} {% for _ in range %} {{ forloop.counter }} {% endfor %} {% endwith %} 

La mia opinione su questo argomento, penso sia la più bella. Tengo un my_filters.py nella directory templatetags.

 @register.filter(name='times') def times(number): return range(number) 

E tu useresti in questo modo:

 {% load my_filters %} {% for i in 15|times %} 
  • Item
  • {% endfor %}

    Forse così?

     {% for i in "x"|rjust:"100" %} ... {% endfor %} 

    È ansible passare un’associazione di

     {'n' : range(n) } 

    al modello, quindi fallo

     {% for i in n %} ... {% endfor %} 

    Nota che otterrai un comportamento basato su 0 (0, 1, … n-1).

    (Aggiornato per la compatibilità con Python3)

    Non passi n stesso, ma piuttosto range(n) [l’elenco di numeri interi da 0 a n-1 inclusi], dalla tua vista al tuo template, e nel secondo fai {% for i in therange %} ( se insisti assolutamente su 1 basato piuttosto che sul normale indice a 0 puoi usare forloop.counter nel corpo del ciclo ;-).

    Basta incolpare chiunque trovi questa domanda … Ho creato un tag modello che ti consente di creare un range(...) : http://www.djangosnippets.org/snippets/1926/

     Accetta gli stessi argomenti del 'range' incorporato e crea un elenco contenente
     il risultato di 'range'.
    
     Sintassi:
         {% mkrange [start,] stop [, step] come context_name%}
    
     Per esempio:
         {% mkrange 5 10 2 as some_range%}
         {% per i in some_range%}
           {{i}}: Qualcosa che voglio ripetere \ n
         {% endfor%}
    
     produce:
         5: Qualcosa che voglio ripetere 
         7: Qualcosa che voglio ripetere 
         9: Qualcosa che voglio ripetere
    
    

    Dovresti usare ” slice ” nel template, un esempio come questo:

    in views.py

     contexts = { 'ALL_STORES': Store.objects.all(), } return render_to_response('store_list.html', contexts, RequestContext(request, processors=[custom_processor])) 

    in store_list.html:

     
      {% for store in ALL_STORES|slice:":10" %}
    • {{ store.name }}
    • {% endfor %}

    Questo metodo supporta tutte le funzionalità dell’intervallo standard range([start,] stop[, step])

    /templatetags/range.py

     from django import template register = template.Library() @register.filter(name='range') def _range(_min, args=None): _max, _step = None, None if args: if not isinstance(args, int): _max, _step = map(int, args.split(',')) else: _max = args args = filter(None, (_min, _max, _step)) return range(*args) 

    Uso:

     {% load range %} 

    stop 5 {% for value in 5|range %} {{ value }} {% endfor %}

    start 5 stop 10 {% for value in 5|range:10 %} {{ value }} {% endfor %}

    start 5 stop 10 step 2 {% for value in 5|range:"10,2" %} {{ value }} {% endfor %}

    Produzione

     

    stop 5 0 1 2 3 4

    start 5 stop 10 5 6 7 8 9

    start 5 stop 10 step 2 5 7 9

    Ho provato molto su questa domanda, e trovo la migliore risposta qui: (da come eseguire il ciclo 7 volte nei modelli django )

    Puoi persino accedere all’IDx!

    views.py:

     context['loop_times'] = range(1, 8) 

    html:

     {% for i in loop_times %}  {% endfor %} 

    Sto solo prendendo la risposta popolare un po ‘più e rendendola più robusta. Questo ti consente di specificare qualsiasi punto iniziale, quindi 0 o 1 per esempio. Usa anche la funzione range di python, dove la fine è uno in meno, quindi può essere utilizzata direttamente con le lunghezze delle liste, ad esempio.

     @register.filter(name='range') def filter_range(start, end): return range(start, end) 

    Quindi nel modello includi semplicemente il file di tag del modello sopra riportato e utilizza quanto segue:

     {% for c in 1|range:6 %} {{ c }} {% endfor %} 

    Ora puoi fare da 1 a 6 anziché solo da 0 a 6 o programmarlo a fondo. Aggiungere un passaggio richiederebbe un tag modello, questo dovrebbe coprire più casi di utilizzo quindi è un passo avanti.

    Puoi utilizzare: {% with ''|center: i as range %}

    Questo essenzialmente richiede una funzione di range . È stato innalzato un ticket di Django ( https://code.djangoproject.com/ticket/13088 ) per questo, ma chiuso come “non verrà risolto” con il seguente commento.

    La mia impressione di questa idea è che sta cercando di condurre alla programmazione nel modello. Se si dispone di un elenco di opzioni che devono essere sottoposte a rendering, devono essere calcolate nella vista, non nel modello. Se questo è semplice come un intervallo di valori, allora così sia.

    Hanno un buon punto: i modelli dovrebbero essere rappresentazioni molto semplici della vista. È necessario creare i dati obbligatori limitati nella vista e passare al modello nel contesto.

    Puoi passare:

    {‘n’: range (n)}

    Per utilizzare il modello:

    {% per i in n%} … {% endfor%}

    Se il numero proviene da un modello, ho trovato che questa fosse una bella patch per il modello:

     def iterableQuantity(self): return range(self.quantity)