Привет, такая проблема. Есть модель:

class Project(models.Model):
    title = models.CharField(max_length=70, blank=False, null=False, default=None)
    parent = models.ForeignKey('self', blank=True, null=True)

    def __unicode__(self):
        return '%s' % self.title

Есть представление:

def list_projects(request):
    projects = Project.objects.all()
    return render_to_response('list/projects.py', context_instance=RequestContext(request, { 'projects': projects }))

И наконец-то шаблон:

{% for project in projects %}
<div class="project_box">
    <strong>{{ project.title }}</strong>
    <div class="sub_project_box">
    </div>
</div>
{% endfor %}

Ситуация: В модели Project хранится название проекта и ключ к родительскому проекту(parent). Иначе говоря, там могут храниться проекты и их подпроекты. Подразумевается, что вложенносьб может быть бесконечной(подпроект в подпроекте и т.д.).

Проблема: Не могу понять, как лучше можно вывести подпроекты у проекта. Т.е. элементы, у которых parent равен ID проекта. Их нужно вывести в div с классом sub_project_box. Делать дополнительный запрос под это как-то не хочется. Подскажите пожалуйста, Спасибо.

задан 02 Июн '12, 16:01

nsafonov's gravatar image

nsafonov
1111
Одобрено: 0%


Можно например это сделать используя модуль mptt

from mptt.models import MPTTModel
from mptt.models import TreeForeignKey

class Project(MPTTModel):
    """Project object"""

    title = models.CharField(_('title'), max_length=255)
    parent = TreeForeignKey('self', null=True, blank=True,
                            verbose_name=_('parent Project'),
                            related_name='children')

    def __unicode__(self):
        return self.title

    class Meta:
        """Category's Meta"""
        ordering = ['title']
        verbose_name = _('Project')
        verbose_name_plural = _('Projects')

    class MPTTMeta:
        """Category MPTT's Meta"""
        order_insertion_by = ['title']

В представлении сделать

'projects': Project.objects.all()

ну и в шаблоне

{% load i18n mptt_tags %}
<ul class="project-root">
  {% recursetree projects %}
  <li>
    <a href="{{ node.get_absolute_url }}" title="{% blocktrans with project=node %}Show all entries in {{ project }}{% endblocktrans %}">{{ node }}</a>
    {% if not node.is_leaf_node %}
    <ul class="project-children project-{{ node.slug }}">
      {{ children }}
    </ul>
    {% endif %}
  </li>
  {% endrecursetree %}
  {% if not projects %}
  <li>
    {% trans "No projects yet." %}
  </li>
  {% endif %}
</ul>

Результат работы такого кода можно увидеть в блоге этого сайта в сайдбаре - Категории.

Постоянная ссылка

отвечен 02 Июн '12, 16:51

Yasha's gravatar image

Yasha
114131722
Одобрено: 60%

изменено 02 Июн '12, 16:52

Berg's gravatar image

Berg ♦♦
5565813

почитал о Mptt, спасибо. Но есть вопрос, мне нужно чтобы у родителя было другое оформление нежели чем у детей)

ну к примеру родитель заключается в div, а дети должны быть в ul li. как это сделать?

спасибо

Постоянная ссылка

отвечен 12 Июн '12, 00:29

nsafonov's gravatar image

nsafonov
1111
Одобрено: 0%

ну так это ж поидее просто через CSS можно решить project-root = это ж отдельный клас как видно в примере шаблона.

(14 Июн '12, 10:53) Berg ♦♦ Berg's gravatar image

Но все равно, как я понял, данный метод обязывает использовать одни тэги как для детей так и для родителей. А мне очень надо использовать разные тэги. Есть какие-нибудь рекомендации? )

Постоянная ссылка

отвечен 10 Июл '12, 22:35

nsafonov's gravatar image

nsafonov
1111
Одобрено: 0%

{% if not node.is_leaf_node %} - вы же можете отследить когда будет новое дочернее - разве нет ?

(30 Сен '12, 21:17) Berg ♦♦ Berg's gravatar image
Ваш ответ
включить просмотр

Следить за вопросом

По Email:

После авторизации вы сможете подписаться на любые обновления здесь

По RSS:

Ответы

Ответы и комментарии

Основы Markdown

  • *italic* or _italic_
  • **bold** or __bold__
  • ссылка:[текст](http://url.com/ "заголовок")
  • изображение?![alt текст](/path/img.jpg "заголовок")
  • нумерованый список: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • основные теги HTML, также поддерживаются

Теги вопроса:

×19
×2
×1
×1

заданые вопросы: 02 Июн '12, 16:01

просмотренные вопросы: 12,804 times

последние обновления: 30 Сен '12, 21:17