【问题标题】:Django-template. How to create list of values for specific key for each element in QuerySetDjango 模板。如何为 QuerySet 中的每个元素创建特定键的值列表
【发布时间】:2020-08-29 15:31:44
【问题描述】:

我通过上下文将所有对象发送到 html:

views.py

def books(request):

    all_books = Book.objects.all()
    context = {'books': all_books}

    return render(request, 'books/books.html', context)

models.py

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=30)
    category = models.IntegerField()
    offset_pages = models.IntegerField()
    read_pages = models.IntegerField()
    total_pages = models.IntegerField()
    book_path = models.CharField(max_length=200, default='')
    status = models.BooleanField(default=False)

    def __str__(self):
        return f'{self.category} | {self.title} | {self.author}'

这是否可以获取 django 模板中特定键的所有值的列表?

我想要 QuerySet 中每个元素的所有 read_pages 值的列表。

我相信我也可以通过上下文来做到这一点,但似乎必须有更好的方法。

我需要一个列表,因为我想稍后发送它做 chart.js。

【问题讨论】:

    标签: python django django-templates


    【解决方案1】:

    如果你想在 Javascript 中使用它,最好的办法是在视图中将查询集转换为 JSON:

    from django.core import serializers
    
    def books(request):
    
        all_books = Book.objects.all()
        serialized_books = serializers.serialize('json', [ all_books, ])
        context = {'books': all_books, 'books_json': serialized_books}
    
        return render(request, 'books/books.html', context)
    

    那么你可以在Django模板中将serialized_books传递给Javascript,如下:

    <script>
        var books_serialized='{{ books_json | safe }}';
    </script>
    

    然后您可以在您的 Javascript 文件中获取对象并获取任何属性:

    let books = JSON.parse(books_serialized)
    Object.keys(books[0]).forEach(function(key) {
        if(key==="fields"){
            console.log(books[key]["read_pages"]);
        }   
    });
    

    【讨论】:

    • 我喜欢你的解决方案,但它还不起作用。我收到错误:AttributeError:'QuerySet' 对象没有属性'_meta'。我应该修改我的模型然后添加类 Meta 吗?
    • 我通常将Meta添加到任何模型中,但是哪一行代码导致了这个错误?
    猜你喜欢
    • 2023-02-05
    • 2022-08-05
    • 2021-11-15
    • 2022-01-26
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    相关资源
    最近更新 更多