如何在 Django 模型中获取子类别及其类别并在模板中显示

How to get subcategory with their category in django models and showing in templates

我想展示我的技能类别及其子类别列表。 从模型中获取数据到视图时,我遇到了问题。 我的代码如下:

model.py 这里我创建了 2 个 类 SkillCategorySkillSubCategory

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 这里我定义了一个基于函数的视图,命名为 skill 其中 return list of list

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 这是应该展示技能的模板:

谁能帮我解决给定的问题。
谢谢和干杯!!

仅传递上下文中的 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 将仅附加到一对多和多对多形式的关系,您也可以指定在任何外键、OneToOneField、ManyToManyField 等上使用 related_name 属性的名称)。

你可以添加这样的相关名称以建立反向关系

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>