Как получить подкатегорию с их категорией в моделях django и показать в шаблонах

#python-3.x #django #python-3.8

#python-3.x #django #python-3.8

Вопрос:

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

model.py Здесь я создаю 2 класса SkillCategory и SkillSubCategory

 class SkillCategory(models.Model):
    id = models.AutoField(primary_key=True)
    category = models.CharField(max_length=100)

    def __str__(self):
        return self.category

class SkillSubCategory(models.Model):
    id = models.AutoField(primary_key=True)
    category = models.ForeignKey(SkillCategory, on_delete=models.CASCADE)
    subcategory = models.CharField(max_length=100)
    icon_name = models.CharField(max_length=100)

    def __str__(self):
        return self.subcategory
 

views.py Здесь я определяю функциональное представление с именем навык, которое возвращает список списка

 def skill(request):
    allsubcat = []
    skillcat = SkillSubCategory.objects.values()
    cat = {c['subcategory'] for c in skillcat}
    for c in cat:
        skill = SkillSubCategory.objects.filter(subcategory=c)
        allsubcat.append([skill])
    ctx = {'allsubcat':allsubcat}
    return render(request, "my_folio/skill.html", ctx) 
 

skill.html Это шаблон, который должен представлять Навык следующим образом:

  • Категория навыков 1
    • Навык SubCat 1
    • Навык SubCat 2
  • Категория навыков 2
    • Навык SubCat 1
    • Навык SubCat 2
    • Навык SubCat 3

Может ли кто-нибудь, пожалуйста, помочь мне по данной проблеме.
Спасибо и приветствия!!

Ответ №1:

Вы можете добавить связанное имя, подобное этому, для обратной связи

 class SkillSubCategory(models.Model):
    id = models.AutoField(primary_key=True)
    category = models.ForeignKey(SkillCategory, on_delete=models.CASCADE, related_name="skill_subcategories")
    subcategory = models.CharField(max_length=100)
    icon_name = models.CharField(max_length=100)

    def __str__(self):
        return self.subcategory
 

в контексте просмотра вы можете передавать только навыки

 def skill(request):
    skills_categories = SkillCategory.objects.all()
    ctx = {'skill_categories': skills_categories}
    return render(request, "my_folio/skill.html", ctx)
 

В шаблоне вы можете выполнить итерацию следующим образом

 <ul>
    {% for category in skill_categories %}
    <li>{{ category.category }}</li>
    <ul>
        {% for subcategory in category.skill_subcategories.all %}
            <li>{{ subcategory.category }}</li>
        {% endfor %}
    </ul>
    {% endfor %}
</ul>
 

Комментарии:

1. Спасибо, чувак! Но я должен добавить еще одно это в ваш код <li>{{ subcategory.subcategory }}</li> . И у меня это отлично работает. Большое спасибо.

2. Братан, у меня есть еще одно сомнение, если вы можете помочь, пожалуйста, свяжитесь со мной на любой платформе. shubhamkgupta.in Спасибо, я жду вашего ответа…

Ответ №2:

Передайте только SkillCategory набор запросов в контексте:

 def skill(request):
    skill_categories = SkillCategory.objects.all()
    ctx = {'skill_categories': skill_categories}
    return render(request, "my_folio/skill.html", ctx)
 

Теперь в шаблоне вы можете выполнить цикл следующим образом:

 <ul>
    {% for skill_category in  skill_categories %}
        <li>{{ skill_category.category }}
            <ul>
                {% for skill_subcategory in skill_category.skillsubcategory_set %}
                    <li>{{ skill_subcategory.subcategory }}</li>
                {% endfor %}
            </ul>
        </li>
    {% endfor %}
</ul>
 

Где skillsubcategory_set просто название соответствующей модели в нижнем регистре с добавлением _set. Django добавляет этот атрибут в вашу модель для каждого связанного с моделью поля (Примечание: _set будет добавлен только для отношений вида Один ко многим и многие ко многим, также вы можете указать имя, используя related_name атрибут для любого ForeignKey, OneToOneField, ManyToManyField и т. Д.).