Имя подкатегории не отображается, несмотря на то, что условие if принимает значение True
Я знаю, что я уже задавал этот вопрос, но я действительно борюсь и не могу решить этот вопрос
Я сделал CRUD продукта с использованием сериализаторов и внешних ключей и делаю динамическую страницу с категориями и подкатегориями. Проблема в том, что несмотря на выполнение условия if, подкатегории не выводятся, только имя_категории, как показано ниже
модели:
class Products(models.Model):
categories = models.ForeignKey(Category,on_delete=models.CASCADE)
sub_categories = models.ForeignKey(SUBCategories,on_delete=models.CASCADE)
color = models.ForeignKey(Colors,on_delete=models.CASCADE)
size = models.ForeignKey(Size,on_delete=models.CASCADE)
image = models.ImageField(upload_to = 'media/',width_field=None,height_field=None,null=True)
title = models.CharField(max_length=70)
price = models.CharField(max_length=10)
sku_number = models.CharField(max_length=10)
product_details = models.CharField(max_length=1000)
quantity = models.IntegerField(default=0)
isactive = models.BooleanField(default=True)
class Category(models.Model):
#made changes to category_name for null and blank
category_name = models.CharField(max_length=30)
category_description = models.CharField(max_length=30)
isactive = models.BooleanField(default=True)
class SUBCategories(models.Model):
category_name = models.ForeignKey(Category, on_delete=models.CASCADE)
sub_categories_name = models.CharField(max_length=30)
sub_categories_description = models.CharField(max_length=30)
isactive = models.BooleanField(default=True)
ниже представлен файл shoppingpage.html
{% for result in category %}
<div class="col-md-3">
<div class="lynessa-listitem style-01">
<div class="listitem-inner">
<a href="/9-6wear" target="_self">
<h4 class="title">{{result.category_name}}</h4>
</a>
{% for ans in subcategory %}
<ul class="listitem-list">
<li>
{% if ans.category_name == result.category_name %}
<a href="/kurta" target="_self">{{ans.sub_categories_name}}</a>
{% endif %}
</li>
</ul>
{% endfor %}
</div>
</div>
</div>
{% endfor %}
Помощь будет очень признательна, спасибо!
Не видя вида, я не могу быть уверен, но кажется, что вы делаете
ans.category_name == result.category_name
где ans
- объект SUBCategories
, а result
- объект Category
. В этом случае ans.category_name является полем ForeignKey, а result.category_name - полем CharField, так что вы, вероятно, не захотите сравнивать их.
Если вы хотите вывести все категории, а для каждой категории вывести каждую подкатегорию, я бы сделал что-то вроде этого:
Дайте вашему внешнему ключу имя в models.py
, также измените запутанные имена полей. Также модели должны быть в единственном числе, поэтому измените имя модели тоже:
class SubCategory(models.Model):
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='sub_categories')
sub_category_name = models.CharField(max_length=30)
sub_category_description = models.CharField(max_length=30)
is_active = models.BooleanField(default=True)
Затем создайте представление для него:
from django.views.generic import TemplateView
class YourView(TemplateView):
template_name = '<your template name>'
def get_context_data(self, *args, **kwargs):
context = super().get_context_data(*args, **kwargs)
# use the foreign key name 'sub_categories' to prefetch related objects to reduce database queries
context['categories'] = Category.objects.all().prefetch_related('sub_categories')
return context
Тогда в вашем шаблоне вам вообще не нужна проверка if, так как вы получите только подкатегории, связанные с данной категорией. Мы используем обратный поиск category.sub_categories.all
для получения подкатегорий, связанных с категорией:
{% for category in categories %}
<div class="col-md-3">
<div class="lynessa-listitem style-01">
<div class="listitem-inner">
<a href="/9-6wear" target="_self">
<h4 class="title">{{category.category_name}}</h4>
</a>
{% for sub_category in category.sub_categories.all %}
<ul class="listitem-list">
<li>
<a href="/kurta" target="_self">{{sub_category.sub_category_name}}</a>
</li>
</ul>
{% endfor %}
</div>
</div>
</div>
{% endfor %}