webentwicklung-frage-antwort-db.com.de

Verwendung des forloop.counter-Werts als Listenindex in einer Django-Vorlage

in meiner Django 1.1.1-Anwendung habe ich eine Funktion in der Ansicht, die eine Reihe von Nummern und eine Liste von Elementlisten in seine Vorlage zurückgibt, zum Beispiel:

...  
data=[[item1 , item2, item3], [item4, item5, item6], [item7, item8, item9]]  
return render_to_response('page.html', {'data':data, 'cycle':range(0,len(data)-1])

Innerhalb der Vorlage habe ich eine externe for-Schleife, die auch eine weitere for-Schleife enthält, um die Inhalte der inneren Datenlisten auf diese Weise in der Ausgabe anzuzeigen

...  
{% for page in cycle %}   
...   
< table >   
{% for item in data.forloop.counter0 %}  
< tr >< td >{{item.a}} < /td > < td > {{item.b}} ... < /td > < /tr >  
...  
< /table >  
{% endfor %}  
{% if not forloop.last %}  
< div class="page_break_div" >  
{% endif %}  
{% endfor %}  
... 

Die Django Template Engine arbeitet jedoch nicht mit dem Wert forloop.counter0 als Index für die Liste (stattdessen, wenn ich manuell einen numerischen Wert als Index eingebe). Gibt es eine Möglichkeit, die Listenschleife mit dem externen Wert forloop.counter0 arbeiten zu lassen? Vielen Dank im Voraus für die Hilfe :)

15
Alex

Sie können keine Variablen für Attributnamen, Wörterbuchschlüssel oder Listenindizes verwenden.

Auch range(0,len(data)-1] ist kein gültiges Python. Es sollte range(len(data)) sein.

Sie brauchen wahrscheinlich keine cycle. Vielleicht möchten Sie Folgendes:

{% for itemlist in data %}
    ...
    <table>
        {% for item in itemlist %}
        <tr>
          <td>{{ item.a }}</td>
          <td>{{ item.b }} ... </td>
        </tr>
        ...
        {% endfor %}
    </table>
    {% if not forloop.last %}
        <div class="page_break_div">
    {% endif %}
{% endfor %}
12
stefanw

Ich habe das ziemlich ineffizient gelöst. Bitte werfen Sie sich nicht in Ihren Computer, wenn Sie diesen Code lesen. Bei zwei Listen gleicher Länge durchläuft es die erste und druckt das entsprechende Element aus der zweiten.

Wenn Sie dies verwenden müssen, verwenden Sie es nur für Vorlagen mit seltenem Zugriff, bei denen die Länge beider Listen gering ist. Im Idealfall sollten Sie die Daten Ihrer Vorlage überarbeiten, um dieses Problem vollständig zu vermeiden.

{% for list1item in list1 %}
   {% for list2item in list2 %}
      {% if forloop.counter == forloop.parentloop.counter %}
          {{ list1item }} {{ list2item }}
      {% endif %}
   {% endfor %}
{% endfor %}
17
Mark

Ich wollte mithilfe eines Stylesheets abwechselnde Farben in meiner Tabelle haben, indem ich eine Liste mit umschaltbaren Wahr/Falsch-Werten übergebe. Ich fand das wirklich frustrierend. Am Ende habe ich eine Liste von Wörterbuchelementen mit den gleichen Schlüsseln wie die Felder in der Tabelle erstellt, plus eines weiteren mit dem umschaltbaren Wert true/false.

def jobListView(request):
    # Django does not allow you to append stuff to the job identity, neither
    # will it allow forloop.counter to index another list. The only solution
    # is to have the toggle embedded in a dictionary along with
    # every field from the job
    j                   = job.objects.order_by('-priority')
    # have a toggling true/false list for alternating colours in the table
    theTog              = True
    jobList             = [] 
    for i in j:
        myJob           = {}
        myJob['id']     = i.id
        myJob['duty']   = i.duty
        myJob['updated'] = i.updated
        myJob['priority'] = i.priority
        myJob['description'] = i.description
        myJob['toggle'] = theTog
        jobList.append(myJob)
        theTog          = not(theTog)
    # next i

    return render_to_response('index.html', locals())
# end jobDetaiView

und meine Vorlage

{% if jobList %}
    <table border="1"><tr>
    <th>Job ID</th><th>Duty</th><th>Updated</th><th>Priority</th><th>Description</th>
    </tr>

    {% for myJob in jobList %}

        <!-- only show jobs that are not closed and have a positive priority. -->
        {% if myJob.priority and not myJob.closeDate %}
            <!-- alternate colours with the classes defined in the style sheet -->
            {% if myJob.toggle %}
                <tr class=d1> 
            {% else %}
                <tr class=d0>
            {% endif %}

            <td><a href="/jobs/{{ myJob.id }}/">{{ myJob.id }}</td><td>{{ myJob.duty }}</td> 
            <td>{{ myJob.updated }}</td><td>{{ myJob.priority }}</td>
            <td class=middle>{{ myJob.description }}</td>
            </tr>
        {% endif %}
    {% endfor %}
    </ul>
{% else %}
    <p>No jobs are in the system.</p>
{% endif %}
3
Jason

Verwenden Sie forloop.last - True, wenn Sie die Schleife zum letzten Mal durchlaufen haben:

{% if forloop.last %}
{% endif %}

Von Integrierte Vorlagen-Tags und -Filter

0
Cubiczx