【问题标题】:Injecting custom data into Django Queryset before passing to template在传递给模板之前将自定义数据注入 Django Queryset
【发布时间】:2022-07-26 13:10:53
【问题描述】:

向 Django QuerySet 追加或注入一些额外数据的最佳方法是什么?

想象一下我正在显示Books 列表的情况,我想显示对每个列表进行特殊计算的结果:

models.py

class Book(models.Model):
    name = models.CharField(max_length=64)

book_list.html

{% for book in objects %}
    {{ book.name }} - {{ book.special_result }}
{% endfor %}

views.py

class BookListView(ListView):
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        books = self.object_list
        
        for book in books:
            book.special_result = do_special_calculation(foo=bar)

        context['books'] = books

        return context

假设do_special_calculation()方法不能在模板中计算,也不能作为模型参数,因为它需要传入一个变量foo

此代码没有达到使每个bookspecial_result 值可从模板访问的预期结果,因为for 循环的每次迭代都会覆盖book 变量。我提出的每个解决方案基本上都涉及构建一个与 QuerySet 并行的新字典,将其传递到模板中,并同时在模板中循环遍历它们,从而导致代码非常难看。

我也不想将do_special_calculations() 的结果保存回数据库,原因有很多(效率、潜在的陈旧数据、无法轻松保存对象)。

使每个条目的特殊计算在模板中可用的最佳方法是什么?

【问题讨论】:

  • books = self.object_listbooks = list(self.object_list)?

标签: python django


【解决方案1】:

我终于通过制作一个空列表并在每个条目上使用setattr() 来解决这个问题。这是一个固定的代码示例:

class BookListView(ListView):
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        books = self.object_list

        book_list = []
        
        for book in books:
            special_result = do_special_calculation(foo=bar)
            setattr(book, "special_result", special_result)
            book_list.append(book)

        context['books'] = book_list

        return context

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 2019-01-29
    • 2023-03-20
    • 2014-05-13
    • 2023-04-02
    相关资源
    最近更新 更多