2016-07-12 14 views
0

Ich habe ein Rang-Attribut für das Objekt 'Menge' in meinen Django-Projektansichten erstellt. Das ist meine Seite. Bid_list page Ich habe versucht {{ bid.rank }} in meiner Vorlage. Ich konnte den Rang für einen bestimmten Betrag in meiner Vorlage nicht abrufen. Bitte helfen Sie mir, wie ich den Rangwert auf meiner Seite bekommen kann.Wie kann ich auf den 'Rang' einer Vorlage zugreifen, die ich zum Sortieren von Objekten in meinen Django-Ansichten zugewiesen habe?

Hier ist mein Code:

views.page:

def bid_list(request): 
    queryset = Bid.objects.all().order_by('amount') 

    current_rank = 1 
    counter = 0 

    for bid in queryset: 
     if counter < 1: # for first bid 
      bid.rank = current_rank 
     else: # for other bids 
      if bid.amount == queryset[counter - 1].amount: 
       # if bid and previous bid have same score, 
       # give them the same rank 
        bid.rank = current_rank 
      else: 
       # first update the rank 
       current_rank += 1 
       # then assign new rank to bid 
       bid.rank = current_rank 
     counter += 1 
    context = { 
     "bid.rank" : "current_rank", 
     "object_list": queryset, 
     "title": "List" 
    } 
    return render(request, 'bid_list.html', context) 

bid_list.html:

<table cellspacing="1" id="myTable" class="table table-striped" > 
<thead> 
<tr> <th>User</th> 
<th>amount</th> 
<th>rank</th> 
</tr> 

</thead> 
{% for obj in object_list %} 
<tbody> 
<tr> <td>{{obj.user}}</td> 

<td>{{obj.amount}}</td> 

{% for bid in bid.rank %} 
<td>{{bid.rank}}</td> 
{% endfor %} 
</tr> 
</tbody> 
{% endfor %} 
</table> 

Update - 1:

html:

{% for obj in object_list %} 
<tbody> 
<tr> <td>{{obj.user}}</td> 
<td>{{obj.amount}}</td> 
<td>{{obj.rank}}</td> 
</tr> 
</tbody> 
{% endfor %} 

Update:

context = { 
     "queryset": queryset, 
     "title": "List" 
    } 

{% for bid in queryset %} 
<tbody> 
<tr> <td>{{bid.user}}</td> 
<td>{{bid.amount}}</td> 
<td>{{bid.rank}}</td> 
</tr> 
</tbody> 

Meine Seite nach dem Code zu aktualisieren - enter image description here

Antwort

1

in Ihrer Vorlage haben Sie durch die queryset geschlungen und setzen Rang für jedes Objekt.

for bid in queryset: 
    # set bid.rank 
context = {...} 
return render(request, 'bid_list.html', context) 

In der Vorlage Kontext, müssen Sie nur die queryset passieren. Fügen Sie 'bid.rank' nicht ein - es ist nicht möglich, einen Punkt in der Vorlagenvariablen zu haben, und Sie möchten den Rang für jedes Objekt, nicht nur current_rank.

context = { 
    "object_list": queryset, 
    "title": "List" 
} 

Dann, wenn Sie eine Schleife durch die Objekte in der queryset, können Sie den Rang erhalten, indem das rank Zugriff auf das Attribut.

{% for obj in object_list %} 
    {{ obj.user }} 
    {{ obj.rank }} 
{% endfor %} 

Sie können diese weniger verwirrend finden, wenn Sie die gleichen Variablennamen in der Ansicht und der Vorlage verwendet - Sie können es durch den Wechsel von queryset und bid zu object_list und obj komplizierter machen.

context = { 
    "queryset": queryset, 
    "title": "List" 
} 

{% for bid in queryset %} 
    {{ bid.user }} 
    {{ bid.rank }} 
{% endfor %} 
+0

Ich bin in der Lage für den Rang zu bekommen nur eine Zeile als meine aktualisierte Seite in der Frage. Wie kann ich Ränge für alle Benutzer erhalten? – vanam

+0

Überprüfen Sie, ob die Einrückung in Ihrem Code korrekt ist.Wenn Sie 'render (...)' innerhalb der Schleife zurückgeben, setzen Sie erst den Rang für das erste Objekt, bevor Sie die Antwort zurückgeben. – Alasdair

+1

Danke für Ihre freundliche Antwort, es funktioniert – vanam

1

In Ihrem Kontextvariable Sie haben:

context = { 
     "bid.rank" : "current_rank", 
     "object_list": queryset, 
     "title": "List" 
    } 

Sie können keine Punkte in Variablennamen verwenden - die Vorlage Renderer sieht {{ bid.rank }} und versucht, variable rank in einem Wörterbuch bid Namen zuzugreifen. Eine andere Sache - "current_rank" wird die tatsächliche Zeichenfolge (current_rank) anstelle der Variablen current_rank der Variablen übergeben. Ändern Sie Ihre Kontext:

context = { 
     "bid_rank" : current_rank, 
     "object_list": queryset, 
     "title": "List" 
    } 

und {{ bid_rank }} in der Vorlage verwenden.

0

Try this:

context = { 
"object_list": queryset, 
"title": "List" 
} 

{% for bid in object_list %} 
{{ bid.user }} 
{{ bid.rank }} 
{% endfor %}