Django - Отображение списка категорий, принадлежащих каждой карточке

У меня есть модель Giftcard, и модель Category, которая хранит все категории, тарифы и сроки для каждой карты. У нее есть внешний ключ к Giftcard.

Я просто хочу иметь возможность выводить список категорий, тарифов и условий для каждой подарочной карты. В текущем виде код отображает одну и ту же категорию, тариф и условия для всех подарочных карт.

модель

class Giftcard(models.Model):
name = models.CharField(max_length=100, unique=True)
card_image = models.ImageField(upload_to='Giftcard', blank=False)
date = models.DateTimeField(auto_now_add=True)
publish = models.BooleanField(default=False)



class Category(models.Model):
category = models.CharField(max_length=250)
name = models.ForeignKey(Giftcard, on_delete=models.CASCADE, related_name="specs")
rate = models.IntegerField()
terms = models.TextField()

Вот мои взгляды

def giftcard(request):
giftcards = Giftcard.objects.filter(publish=True)

context = {
    'giftcards': giftcards,
}

return render(request, 'dashboard/giftcard.html', context)

Вот мой шаблон

Из django-doc, вы должны сделать ForeginKey поле в вашей основной Giftcard таблице, которое будет делать ManyToOne связь с Category таблицей.

Попробуйте это:

models.py

from django.db import models


class Category(models.Model):
    category = models.CharField(max_length=250)
    rate = models.IntegerField()
    terms = models.TextField()

    def __str__(self):
        return self.category


class Giftcard(models.Model):
    name = models.CharField(max_length=100, unique=True)
    card_image = models.ImageField(upload_to='Giftcard/', blank=False)
    date = models.DateTimeField(auto_now_add=True)
    publish = models.BooleanField(default=False)
    gift_category = models.ForeignKey(Category, on_delete=models.CASCADE)

views.py

def giftcard(request):
    giftcards = Giftcard.objects.filter(publish=True)

    context = {
        'giftcards': giftcards
    }
    return render(request, 'dashboard/giftcard.html', context)

Теперь вы можете получить доступ ко всем свойствам Category таблицы в Giftcard элементах вашего template файла, а giftcard может иметь более одной категории, это называется ManyToOne отношением,

Note: вы также можете использовать choices, что гораздо лучше, чем делать table, вы можете увидеть это здесь в django-doc.

Если, как вы говорите в одном из комментариев, "так не получится, потому что у подарочной карты может быть более одной категории" и "Нет, у категории не может быть более одной подарочной карты", то ваши оригинальные модели правильные, с ForeignKey в классе Category. Во-вторых, я не знаю, что именно происходит, возможно, добавьте скриншоты того, что у вас получается неправильно, потому что я только что попробовал ваш оригинальный код, и он работает, с изменениями datalist, предложенными @Sunderam. Проверьте это в своем html-шаблоне:

{% for giftcard in giftcards %}
    {% for spec in giftcard.specs.all %}
        {{ spec.terms }}<br>
        {{ spec.category }}<br>
        {{ spec.rate }}<br>
    {% endfor %}
{% endfor %}

Когда я это сделал, я вижу разные условия, категории и тарифы для каждой. Опять же, разве это не то, чего вы хотите?

Edit
. Вы должны понимать, что список данных будет содержать все значения spec, и одно появляется, когда вы начинаете вводить в поле ввода. например, если вы введете c, то список появится с всеми категориями, которые начинаются с c.

Вернуться на верх