django类别:如何使用django-categories获取某个类别的孩子?

时间:2013-11-24 18:15:03

标签: python django

我正在使用django-categories来实现与音乐相关的应用。我希望艺术家作为我的类别,他/她的歌曲作为孩子

models.py

from django.db import models
from django_extensions.db.fields import AutoSlugField
from categories.models import CategoryBase

class Artist(CategoryBase):
    cat = models.CharField(max_length=255, blank=True)

    def __unicode__(self):
        return self.name

class Song(models.Model):
    title = models.CharField(max_length=255,)
    slug = AutoSlugField(populate_from='title', unique=True)
    description = models.TextField()
    cat = models.ForeignKey(Artist, blank=True)

    def __unicode__(self):
        return self.title

在模板中,artist_details.html

{% extends 'base_post.html' %}
{% load category_tags %}
{% block page_content %}

<h1>{{ artist.name }}</h1>

{% if artist.children.count %}
    <h2>Subcategories</h2>
    <ul>
        {% for child in artist.children.all %}
        <li><a href="{{ child.get_absolute_url }}">{{ child }}</a></li>
        {% endfor %}
    </ul>
{% endif %}

模板正在渲染,因为我可以看到艺术家的名字。但是我无法取回孩子们。我查了一下文档,但是找不到与抓取孩子有关的东西。

我的数据库中有两个型号的数据,我通过管理界面添加了相关信息。谁能告诉我我错过了什么?

我也愿意使用更好的套餐。您可以提供任何实现类别的建议。

解决方案:来自django docs https://docs.djangoproject.com/en/1.6/topics/templates/#accessing-method-calls

感谢mariodev

1 个答案:

答案 0 :(得分:0)

即使使用django-categories,也不能将歌曲作为艺术家的孩子。艺术家只是没有形成一个类别。

你反而想要的是这样的:

from django.db import models
from django_extensions.db.fields import AutoSlugField
from categories.models import CategoryBase

class MusicCategory(CategoryBase):
    # add extra fields, like images, "featured" and such here
    pass

class Artist(CategoryBase):
    name       = CharField(max_length=255,)
    categories = models.ManyToManyField(MusicCategory, related_name="artists")

    def __unicode__(self):
        return self.name

class Song(models.Model):
    slug        = AutoSlugField(populate_from='title', unique=True)
    title       = models.CharField(max_length=255,)
    artist      = models.ForeignKey(Artist, related_name="songs", on_delete=models.PROTECT)
    categories  = models.ManyToManyField(MusicCategory, related_name="songs")
    description = models.TextField()

    def __unicode__(self):
        return self.title

并使用一些模板

{% extends 'base_post.html' %}
{% load category_tags %}
{% block page_content %}

<h1>{{ artist.name }}</h1>

{% if artist.songs.all.exists %}
    <h2>Songs</h2>
    <ul>
        {% for song in artist.songs.all %}
        <li><a href="{{ song.get_absolute_url }}">{{ song }}</a></li>
        {% endfor %}
    </ul>
{% endif %}

参考:https://django-categories.readthedocs.org/en/latest/custom_categories.html#creating-custom-categories