【问题标题】:Nested conversation list with django使用 django 嵌套对话列表
【发布时间】:2010-11-25 12:50:32
【问题描述】:

嘿,我有这样的模型

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 字段,因此 Thread 可以成为其他 Thread 的子级。

我可以做一些事情,比如 -

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

这会将线程获取到照片,但是,此系统允许回复也有回复。

我将如何遍历所有回复并获取这些回复(一直到我们拥有的最大回复数)。

我想将其显示为嵌套的 HTML 列表。我还希望能够通过“投票”字段订购所有主题和回复。

谢谢

【问题讨论】:

  • 有几种方法可以构建这样的列表。请提供一个示例列表,准确显示您想要的结构。
  • 请更新您的问题。不要添加 cmets。修正问题。
  • 根据线程的大小,这种方法可能会很慢。查看 django-mptt 以更有效地使用 Django code.google.com/p/django-mptt 处理树

标签: python django list foreign-keys nested


【解决方案1】:

欢迎使用递归。这是一个常见的解决方案

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

这种事情会为每个线程返回一个 2 元组列表及其所有回复。

如果回复没有子线程,则后续列表为空。这可能会变得笨重,因此有些人喜欢对其进行优化。

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

坚持第一个,每个线程都是一个 2 元组。我们可以用 HTML 来装饰 2 元组。

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

这将为您的嵌套线程提供嵌套的&lt;ul&gt; 标签。

【讨论】:

  • 这段代码应该放在哪里?在模型内作为一种方法?还是作为模板标签?
  • 第三个函数中的 thread_results 是 Thread.objects.all() 的结果吗?
  • @dotty:“这段代码应该去哪里?”查看功能。 “第三个函数中的 thread_results 是 Thread.objects.all() 的结果?”。不,甚至没有接近。这是thread_plus_replies 的结果:线程的二元组并回复该线程。
  • 这就是我得到的pastie.org/1326181 但是它抛出一个“函数”对象没有属性“回复”任何想法?
  • 我已经用我的模型的真实表示更新了我的问题。
【解决方案2】:

编写一个包含模板标签,在其模板中使用它自己。

【讨论】:

  • 不。但这真的不是特别难。只需在模板顶部做一个{% load %} 并通过replies 传递当前消息。
  • 好吧,我知道了。我将尝试编写自定义模板标签。
  • 我正在努力让这个工作,你有让我开始的样本吗?
猜你喜欢
  • 2015-06-20
  • 2021-01-16
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
相关资源
最近更新 更多