Django | HTML Ошибка рендеринга | Проблема с запросом | Модели | Просмотры - PullRequest
0 голосов
/ 29 мая 2020

В файле 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

1 Ответ

0 голосов
/ 29 мая 2020

Думаю, проблема в первой части условия (if combo in ...). Я бы интерпретировал это в шаблоне как «содержится ли в этом списке значение моей переменной {{combo}}?».

Насколько я понимаю, вы хотите проверить не только то, что combo_list не пусто, но и что хотя бы одному элементу списка назначено свойство Combo. Возможно, вы могли бы сделать это, просматривая список и используя временную переменную, но Django лучшие практики рекомендуют держать все c logi подальше от шаблона.

Лучшим вариантом является определение свойства в модель вашей тележки и используйте ее из своего шаблона. Это также сделает шаблон более читабельным. Итак, вы должны сделать:

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 %}
...