【问题标题】:Django | HTML Render Issue | Querying Issue | Models | Views姜戈 | HTML 渲染问题 |查询问题 |型号 |意见
【发布时间】:2020-09-16 14:25:49
【问题描述】:

在 html 文件中,我尝试呈现“删除”按钮。如果我只是打印出{{combo}} 它会呈现出来。但是,如果我尝试根据购物车模型查询它,它不会呈现按钮。我也试过像 {% if combo in cart.combo_item.combo.all %} 这样查询它,但没有用。

update-cart.html

<form method="POST" action="{% url 'carts:combo_add_to_cart' %}" class="form">
    {% csrf_token %}
    <input type="hidden" name="combo_id" value="{{ combo.id }}">
    <button type="submit" class="btn btn-success">Add to Cart</button>
    {% if combo in cart.combo_item.all %}
        <button type="submit" class="btn btn-success">Remove?</button>
    {% endif %}
</form>
{{combo}}

cart.models

class ComboCartItem(models.Model):
    user = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)
    combo = models.ForeignKey(Combo, blank=True, null=True, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)
    ordered = models.BooleanField(default=False)

    def __str__(self):
        return f"{self.quantity} of {self.combo.combo}"

class Cart(models.Model):
    user = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)
    combo_item = models.ManyToManyField(ComboCartItem, blank=True, null=True)
    addon_item = models.ManyToManyField(AddonCartItem, blank=True, null=True)
    ordered = models.BooleanField(default=False)

    cart_total = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)

    objects = CartManager()

    def __str__(self):
        return str(self.id)

combo.models

class Combo(models.Model):
    title = models.CharField(max_length=120)
    combo_regular_price = models.DecimalField(decimal_places=2, max_digits=10, default=0.00)
    combo_sale_price = models.DecimalField(decimal_places=2, max_digits=10, default=0.00)
    timestamp = models.DateTimeField(auto_now_add=True)
    slug = models.SlugField(blank=True, null=True)
    active = models.BooleanField(default=True)

    objects = ComboManager()

    def __str__(self):
        return self.title

views.py

class ComboList(ListView):
    template_name = 'products/list.html'

    def get_context_data(self, *args, **kwargs):
        context = super(ComboList, self).get_context_data(*args, **kwargs)
        cart_obj, new_obj = Cart.objects.new_or_get(self.request)
        context['cart'] = cart_obj
        return context

    def get_queryset(self, *args, **kwargs):
        request = self.request
        combo = Combo.objects.all()
        return combo

【问题讨论】:

    标签: django django-models django-views django-templates render


    【解决方案1】:

    我认为问题出在条件的第一部分(if combo in...)。我会在模板中将其解释为“我的变量 {{combo}} 的值是否包含在此列表中?”。

    据我了解,您不仅要检查 combo_list 不为空,而且要检查列表中的至少一项是否分配了 Combo 属性。也许您可以遍历列表并使用临时变量来执行此操作,但 Django 最佳实践建议您将所有逻辑远离模板。

    最好的选择是在您的购物车模型中定义一个属性,然后从您的模板中使用它。它还将使模板更具可读性。所以你会这样做:

    class Cart(models.Model):
        ...
    
        @property
        def is_empty(self):
             return self.combo_item.filter(combo__isnull=False).exists()
    

    然后,在你的模板中使用这个属性:

    {% if not cart.is_empty %}
        <button type="submit" class="btn btn-success">Remove?</button>
    {% endif %}
    

    【讨论】:

    • 我有多个组合项目。如果我根据 True 或 False 查询它。然后它为所有组合项呈现删除按钮。但我想根据购物车中的特定组合来渲染它
    • 假设我有 Combo 1、Combo 2、Combo 3。所有这些都可以选择添加到购物车。当我单击 Combo 2 的添加到购物车按钮时,删除按钮应仅针对该 Combo 即 Combo 2 出现。不适用于 Combo 1 和 Combo 2
    • 哦,但这是一个不同的问题吗?我没有在最初的问题中提取这是您的问题。为此,我要再说一遍,最好的选择是在视图代码中执行您的逻辑,而不是在模板中。因此,在您的ComboListView 中,将该信息添加到您的列表项中(如果在get_queryset()get_context_data() 方法中使用select_related() 获取该信息,您会更好地了解哪种方法最适合您)跨度>
    • 谢谢!我明白你的意思,我会尝试这样做。
    猜你喜欢
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2014-07-11
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    相关资源
    最近更新 更多