Python 如何在Django中筛选类别

Python 如何在Django中筛选类别,python,django,Python,Django,我有个小问题。我想创建一个网页目录之类的东西。在我的模型中,我创建了一个类Kategorie和一个类Firma。类Kategoria创建主类别和子类别。在Firma类中,我可以在witch category和subcategory中定义新记录的归属。我的问题是:如何在html中显示主页上的主要类别,并稍微降低子类别,如图所示 这是我的密码 型号.py from django.db import models from django.contrib.auth.models import User

我有个小问题。我想创建一个网页目录之类的东西。在我的模型中,我创建了一个类Kategorie和一个类Firma。类Kategoria创建主类别和子类别。在Firma类中,我可以在witch category和subcategory中定义新记录的归属。我的问题是:如何在html中显示主页上的主要类别,并稍微降低子类别,如图所示

这是我的密码 型号.py

from django.db import models
from django.contrib.auth.models import User


class Kategoria(models.Model):
    name = models.CharField(max_length=250, verbose_name='Kategoria')
    slug = models.SlugField(unique=True,verbose_name='Adres SEO')
    parent = models.ForeignKey('self', blank=True, null=True, related_name='children', on_delete=models.CASCADE)

    class Meta:
        unique_together = ('slug', 'parent',)
        verbose_name = 'Kategoria'
        verbose_name_plural = 'Kategorie'

    def __str__(self):
        full_path = [self.name]
        k = self.parent

        while k is not None:
            full_path.append(k.name)
            k = k.parent

        return ' / '.join(full_path[::-1])

class Firma(models.Model):
    user = models.ForeignKey(User, default=1, verbose_name='Użytkownik', on_delete=models.CASCADE)
    title = models.CharField(max_length=250, verbose_name='Nazwa firmy')
    slug = models.SlugField(unique=True, verbose_name='Adres SEO')
    category = models.ForeignKey('Kategoria', null=True, blank=True, verbose_name='Kategoria', on_delete=models.CASCADE)
    content = models.TextField(verbose_name='Opis')
    draft = models.BooleanField(default=False, verbose_name='Szablon')
    publish = models.DateField(auto_now=False, auto_now_add=False)


    class Meta:
        verbose_name='Firma'
        verbose_name_plural='Firmy'

    def __str__(self):
        return self.title
from django.shortcuts import render, get_object_or_404
from .models import Kategoria, Firma



def widok_kategorii(request):
    kategorie = Kategoria.objects.filter().order_by('name')
    context = {'kategorie': kategorie}
    return render(request, 'ogloszenia/index.html', context=context)
视图.py

from django.db import models
from django.contrib.auth.models import User


class Kategoria(models.Model):
    name = models.CharField(max_length=250, verbose_name='Kategoria')
    slug = models.SlugField(unique=True,verbose_name='Adres SEO')
    parent = models.ForeignKey('self', blank=True, null=True, related_name='children', on_delete=models.CASCADE)

    class Meta:
        unique_together = ('slug', 'parent',)
        verbose_name = 'Kategoria'
        verbose_name_plural = 'Kategorie'

    def __str__(self):
        full_path = [self.name]
        k = self.parent

        while k is not None:
            full_path.append(k.name)
            k = k.parent

        return ' / '.join(full_path[::-1])

class Firma(models.Model):
    user = models.ForeignKey(User, default=1, verbose_name='Użytkownik', on_delete=models.CASCADE)
    title = models.CharField(max_length=250, verbose_name='Nazwa firmy')
    slug = models.SlugField(unique=True, verbose_name='Adres SEO')
    category = models.ForeignKey('Kategoria', null=True, blank=True, verbose_name='Kategoria', on_delete=models.CASCADE)
    content = models.TextField(verbose_name='Opis')
    draft = models.BooleanField(default=False, verbose_name='Szablon')
    publish = models.DateField(auto_now=False, auto_now_add=False)


    class Meta:
        verbose_name='Firma'
        verbose_name_plural='Firmy'

    def __str__(self):
        return self.title
from django.shortcuts import render, get_object_or_404
from .models import Kategoria, Firma



def widok_kategorii(request):
    kategorie = Kategoria.objects.filter().order_by('name')
    context = {'kategorie': kategorie}
    return render(request, 'ogloszenia/index.html', context=context)
index.html

{%include'ogloszenia/header.html%}
维特·凯特戈里
{kategorie%中的kategoria为% {{kategoria.name}}
{%endfor%} {%include'ogloszenia/footer.html%}
所以问题是子类别,对吗

您可以在模板中使用
inclusion\u标记
,正如我在这里曾经提到的:

如果您需要呈现多个级别的子类别,那么只需按照我在链接中提到的操作即可

但是如果你只需要第一个级别,那么它非常简单:

视图。py:

{% include 'ogloszenia/header.html' %}
Wyświetl kategorie<br>
<ul>
    {% for kategoria in kategorie %}
        <li>
            {{kategoria.name}}
            {% if kategoria.children.count > 0 %}
                <ul>
                    {% for sub in kategoria.children.all %}
                        <li>{{ sub.name }}</li>
                    {% endfor %}
                </ul>
            {% endif %}
        </li>
    {% endfor %}
</ul>


{% include 'ogloszenia/footer.html' %}
获取没有任何父级的类别(第2行)

模板:

{% include 'ogloszenia/header.html' %}
Wyświetl kategorie<br>
<ul>
    {% for kategoria in kategorie %}
        <li>
            {{kategoria.name}}
            {% if kategoria.children.count > 0 %}
                <ul>
                    {% for sub in kategoria.children.all %}
                        <li>{{ sub.name }}</li>
                    {% endfor %}
                </ul>
            {% endif %}
        </li>
    {% endfor %}
</ul>


{% include 'ogloszenia/footer.html' %}
{%include'ogloszenia/header.html%}
维特·凯特戈里
    {kategorie%中的kategoria为%
  • {{kategoria.name} {%如果kategoria.children.count>0%}
      {kategoria.children.all%中sub的%s}
    • {{sub.name}}
    • {%endfor%}
    {%endif%}
  • {%endfor%}
{%include'ogloszenia/footer.html%}
你可以把它设计成你发布的图片的样子,但这是实现这种设计的树形结构的方法