tutorial - test django




pour boucle dans le modèle django-l'objet liste n'a pas d'attribut 'get' (2)

Cela semble être très simple mais je n'ai pas été capable de trouver une réponse à ce problème spécifique. Essentiellement, je veux que mon modèle Django fasse défiler une liste que j'ai faite dans la vue de cette page. Cependant, quand j'essaie de l'exécuter, je reçois l'erreur "Attribute Error: 'list' n'a pas d'attribut 'get'". J'ai essayé de développer un peu l'application de sondage Django et l'idée de cette application est d'avoir des livres, triés par auteur, sur lesquels voter. Donc, cette vue va montrer une table avec les noms de l'auteur d'un côté et le nombre total de votes de chacun des livres de l'auteur combinés.
Voici les modèles.

class Author(models.Model):
    author_name = models.CharField(max_length=200)

    def __unicode__(self):
        return self.author_name


class Book(models.Model):
    author = models.ForeignKey(Author)
    title = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __unicode__(self):
        return self.title

Voici la vue où j'ai essayé de regrouper les votes par auteur et de les ajouter à une liste.

def totals(request):
    a = Author.objects.order_by('author_name')
    b = Book.objects.order_by('author__author_name')
    total = []
    for i in range(len(b)):
        if i < len(b)-1:
            x = b[i].votes
            if b[i].author == b[i+1].author:
                x += b[i+1].votes
            else:
                total.append(x)
        else:
            x = b[i].votes
            total.append(x)
            return total

    return render(request, "book/totals.html", {"a":a, "total":total})

Et voici le modèle. la première boucle pour "a" fonctionne bien, c'est la seconde qui est censée faire défiler les "totaux" qui ne fonctionnent pas.

<h1>Total Votes</h1>
<table style="border-collapse:collapse;">
<thead>
    <tr>
        <th colspan="2"><strong>Totals</strong></th>
    </tr>
    <tr style="border-bottom:1px solid black;">
        <th style="padding:5px;"><em>Authors</em></th>
        <th style="padding:5px;border-left:1px solid black;"><em>Votes</em></th>
    </tr>
    </thead>

    {% for author in a %}
        <tr>
            <td>{{ author }}</td>
        </tr>
    {% endfor %}
    {% for x in total %}
        <tr>
            <td>{{ total[x] }}</td>
        </tr>
    {% endfor %}
</thead>

Ok, je pense que ça le fait. Merci à tous ceux qui ont lu jusqu'ici. Évidemment, je suis assez nouveau à ce sujet, donc s'il y a d'autres commentaires ou commentaires, je serais certainement reconnaissant de les entendre. Merci!

Edit: Voici la traceback -

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/book/totals/

Django Version: 1.8.3
Python Version: 2.7.10
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'book')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.middleware.security.SecurityMiddleware')


Traceback:
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  223.                 response = middleware_method(request, response)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/middleware/clickjacking.py" in process_response
  31.         if response.get('X-Frame-Options', None) is not None:

Exception Type: AttributeError at /book/totals/
Exception Value: 'list' object has no attribute 'get'

Essayez d'utiliser simplement x, car x est un objet et non un index.

{% for x in total %}
        <tr>
            <td>{{ x }}</td>
        </tr>
    {% endfor %}

J'espère être utile.


Votre vue devrait renvoyer une réponse HTTP. Cependant, votre vue renvoie le total , qui est une list .

         return total

Vous devez soit supprimer cette ligne, soit la modifier pour qu'elle renvoie une réponse HTTP.







django-views