从 Django 中的模板预处理模型子项

Pre-process model childeren from a template in Django

我有一个 DetailView 来显示菜单(餐厅),结构如下:

菜单 > 课程 > Course_Categories > 菜肴 即(Theather 菜单)>(开胃菜、主菜、甜点)>(鱼汤、排骨等)

我想预取 course_categories 和菜品,此外我想在模板中使用的每道菜上设置一个 属性。 属性(价格)取决于一天中的时间,因此它不是简单地存储为 Dish 上的值。

我尝试了以下方法:

class MenuView(generic.DetailView):

template_name = "cms/detail/menu.html"
model = Menu    

def get_object(self, queryset=None):
    pkValue = pk = self.kwargs.get(self.pk_url_kwarg, None)
    menu = Menu.objects.get(id=pkValue)
    courses = menu.courses.all().prefetch_related('course_categories').prefetch_related('dishes')

    for course in courses.all().iterator():
        for course_category in course.course_categories.all().iterator():
            for dish in course_category.dishes.all().iterator():
                dish.price = "0.00"
    return menu

当我在模板中迭代数据时,它显示了所有内容,但没有 dish.price 属性 的值。我认为发生的情况是相关集被重新检索,因此我的自定义集 属性 没有显示。

模板:

        {% for course in menu.courses.iterator %}
            <tr>
                <td><strong>{{ course.name }}</strong></td>
            </tr>
            {% for course_category in course.course_categories.iterator %}
                <tr>
                    <td><em>&nbsp;&nbsp;&nbsp;{{ course_category.name }}</em></td>
                </tr>
                {% for dish in course_category.dishes.iterator %}
                    <tr>
                        <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ dish.name }} {{ dish.price}}</td>                            
                    </tr>
                {% endfor %}
            {% endfor %}
        {% endfor %}

有什么建议吗?

您使用的 iterator() 明确不会缓存结果。当您执行 {% for course in menu.courses.iterator %} 时,会再次从数据库中获取结果。

在您的视图中简单地使用 .all() 而不是 .all().iterator(),并停止在您的模板中使用 .iterator,您应该不会有问题。