【问题标题】:Django for loop in views.py only gets the first occurenceviews.py 中的 Django for 循环仅获得第一次出现
【发布时间】:2021-04-01 11:26:29
【问题描述】:

我正在尝试根据登录的用户信息为列表中的每个项目显示不同的价格。

但是,我当前的代码似乎用第一次出现的“custom_price”覆盖了“price”键......我似乎找不到解决方案。

class MenuListView(ListView):
    model = Menu
    template_name = 'home.html'

    def get_context_data(self, **kwargs):
        if self.request.user.is_authenticated:
            context = super(MenuListView, self).get_context_data(**kwargs)
            user=get_object_or_404(Profile, user = self.request.user)
            coef = user.bmr
            menus = Menu.objects.all()
            price = []
            for menu in menus:
                menu_price = menu.price
                menu_kcal = menu.kcal
                custom_price = (menu_price/menu_kcal) * (coef*(35/100))
                price.append(custom_price)
            context['menus'] = menus
            context['prices'] = price
            return context

模板:

  {% for item in menus %}
            <div class="col-sm-6 col-md-6 col-lg-6">
                <div class="food-card food-card--vertical">
                    <div class="food-card_img">
                      {% for img in item.photo_set.all %}
                        <img src="{{ img.image.url }}" alt="">
                        {% endfor %}
                    </div>
                    <div class="food-card_content">
                        <div class="food-card_title-section">
                            <span  class="food-card_title">{{ item.title }}</span>
                            <span  class="food-card_author">{{ item.category }} - {{ item.focus }}</span>
                        </div>
                        <div class="food-card_bottom-section">
                            <div class="space-between">
                                <div>
                                    <span class="fa fa-fire"></span> {{ item.kcal }} Kcal
                                </div>

                            </div>
                            <hr>
                            <div class="space-between">
                                <div class="food-card_price">
                                          {% for p in prices %}
                                    <span>{{ p }} €</span>
                                          {% endfor %}
                                </div>

                            </div>
                        </div>
                    </div>
                </div>
            </div>

            {% endfor %} 

有人可以帮忙吗?

提前非常感谢!

【问题讨论】:

  • 你如何在模板中渲染这个?
  • 嗨,威廉,我编辑了这篇文章。
  • 你在前面的模板中使用price 做一些不同的事情吗?在您看来,您将price 设置为一个列表,但模板看起来像是一个单一值。这对我来说似乎是一个差异。

标签: python django


【解决方案1】:

您还需要遍历您的价目表。你只是在循环你的菜单列表。

菜单上的每个项目都有一个价格,价格在您的价格表上。如果您只使用{{ price }},则会显示整个价格列表,而不是某个商品的具体价格。

编辑: 只需要同时遍历列表,因为它们具有相同的大小。

更好的方法是将两个列表压缩为here

menus_prices = zip(menus, prices)
context['menus_prices'] = menus_prices
return context

在模板中你可以这样做:

{% for item, price in menus_prices %}
            <div class="col-sm-6 col-md-6 col-lg-6">
                <div class="food-card food-card--vertical">
                    <div class="food-card_img">
                      {% for img in item.photo_set.all %}
                        <img src="{{ img.image.url }}" alt="">
                        {% endfor %}
                    </div>
                    <div class="food-card_content">
                        <div class="food-card_title-section">
                            <span  class="food-card_title">{{ item.title }}</span>
                            <span  class="food-card_author">{{ item.category }} - {{ item.focus }}</span>
                        </div>
                        <div class="food-card_bottom-section">
                            <div class="space-between">
                                <div>
                                    <span class="fa fa-fire"></span> {{ item.kcal }} Kcal
                                </div>

                            </div>
                            <hr>
                            <div class="space-between">
                                <div class="food-card_price">
                                          
                                    <span>{{ price }} €</span>
                                          
                                </div>

                            </div>
                        </div>
                    </div>
                </div>
            </div>

            {% endfor %} 

【讨论】:

  • 真的谢谢你!但这并没有解决主要问题,即在列表中,我只能获得第一个菜单项的自定义价格。
  • @agl 现在检查我的答案
猜你喜欢
  • 2018-09-08
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
相关资源
最近更新 更多