从Django模板中预处理模型儿童

时间:2015-02-17 09:41:10

标签: django django-models django-templates

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

菜单>课程> Course_Categories>碗碟 即(Theather Menu)> (起始者,主菜,甜点)> (鱼汤,肋骨等)

我想预取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 %}

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

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

在您的视图中使用.all()代替.all().iterator(),并停止在模板中使用.iterator,并且您不应该遇到问题。