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.