【问题标题】:How to filter categories in Django如何在 Django 中过滤类别
【发布时间】:2018-02-09 13:59:48
【问题描述】:

我有一个小问题。我想创建类似网页目录的东西。在我的模型中,我创建了一个类别类别和类别 Firma。类类别创建主要类别和子类别。在 Firma 类中,我可以在女巫类别和子类别中定义新记录将属于。我的问题是:如何在主页主要类别的 html 中显示,并像这张图片一样降低子类别

这是我的代码 models.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

views.py

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' %}
Wyświetl kategorie<br>

{% for kategoria in kategorie %}
<b>{{kategoria.name}}<br></b>
{% endfor %}


{% include 'ogloszenia/footer.html' %}

【问题讨论】:

    标签: python django


    【解决方案1】:

    所以问题是子类别,对吧?

    你可以在你的模板中使用inclusion_tag,就像我在这里提到的那样: Tree Structure (Foreign Keys to itself) and templates

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

    但如果你只需要第一级,那也很简单:

    views.py:

    获取没有任何父级的类别(第 2 行)

    def widok_kategorii(request):
        ### Get the categories without any parent.
        kategorie = Kategoria.objects.filter(parent=None).order_by('name')
        context = {'kategorie': kategorie}
        return render(request, 'ogloszenia/index.html', context=context)
    

    模板:

    {% 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' %}
    

    您可以将其设计为看起来像您发布的图片,但这是实现此类设计的树结构的方法。

    【讨论】:

      猜你喜欢
      • 2020-09-16
      • 2013-01-12
      • 1970-01-01
      • 2020-01-23
      • 2011-04-07
      • 2020-08-28
      • 2016-05-01
      • 2015-11-10
      • 2021-10-02
      相关资源
      最近更新 更多