从 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> {{ course_category.name }}</em></td>
</tr>
{% for dish in course_category.dishes.iterator %}
<tr>
<td> {{ dish.name }} {{ dish.price}}</td>
</tr>
{% endfor %}
{% endfor %}
{% endfor %}
有什么建议吗?
您使用的 iterator()
明确不会缓存结果。当您执行 {% for course in menu.courses.iterator %}
时,会再次从数据库中获取结果。
在您的视图中简单地使用 .all()
而不是 .all().iterator()
,并停止在您的模板中使用 .iterator,您应该不会有问题。
我有一个 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> {{ course_category.name }}</em></td>
</tr>
{% for dish in course_category.dishes.iterator %}
<tr>
<td> {{ dish.name }} {{ dish.price}}</td>
</tr>
{% endfor %}
{% endfor %}
{% endfor %}
有什么建议吗?
您使用的 iterator()
明确不会缓存结果。当您执行 {% for course in menu.courses.iterator %}
时,会再次从数据库中获取结果。
在您的视图中简单地使用 .all()
而不是 .all().iterator()
,并停止在您的模板中使用 .iterator,您应该不会有问题。