Вложенный список разговоров с Джанго - PullRequest
0 голосов
/ 25 ноября 2010

Хей, у меня есть такая модель

def Photo(models.Model):
    # Photo object fields...

def PhotoThread(models.Model):
    photo = models.ForeignKey(Photo)
    message = models.TextField(blank=True)
    reply_to = models.ForeignKey('self', related_name='replies', null=True, blank=True)
    votes = models.IntegerField()

Как вы можете видеть, у объекта Thread есть поле reply_to, так что потоки могут становиться дочерними по отношению к другим потокам.

Я могу сделать что-то вроде -

photo = Photo.objects.get(pk=1)
threads = photo.photothread_set.all()

Это приведет к появлению темы на фотографии, однако эта система позволяет ответам также иметь ответы.

Как бы мне пройтись по всем ответам и получать ответы на них (вплоть до максимального количества ответов, которые у нас есть).

Я хочу отобразить это как вложенный список HTML. Также я хочу иметь возможность упорядочить все темы и ответы в поле «голоса».

Спасибо

Ответы [ 2 ]

2 голосов
/ 25 ноября 2010

Добро пожаловать в рекурсию.Вот общее решение

def thread_plus_replies( someThread ):
    return someThread, [ thread_plus_replies(r) for r in someThread.replies.ordered('votes').all() ]

. Этот тип возвращает список из двух кортежей для каждого потока и всех его ответов.

Если в ответе нет вспомогательных цепочек, следующий список пуст.Это может быть неуклюжим, поэтому некоторые люди любят его оптимизировать.

def thread_plus_replies( someThread ):
    if len(someThread.replies) == 0:
        return someThread
    return someThread, [ thread_plus_replies(r) for r in someThread.replies ]

Придерживаясь первого, каждый поток представляет собой 2-кортеж.Мы можем украсить 2-кортеж HTML.

def make_html( thread_results ):
    head, tail = thread_results
    return "<ul><li>{0}</li><li>{1}</li></ul>".format( head, make_html(tail) )

Это даст вам вложенные теги <ul> для ваших вложенных потоков.

1 голос
/ 25 ноября 2010

Напишите тег шаблона включения, который использует себя в своем шаблоне.

...