标签: threaded-comments

Django - 实现线程注释的正确方法

我正在使用Django开发一个博客网站.我的网站将允许用户评论我的任何博客文章,并相互回复,并将使用"线程评论"结构显示(我还没有启动用户功能,只是评论).我已经使用django-mptt(至少,现在)使用线程注释正常工作,但如果我正在采取的路线或步骤方向正确,我没有CLUE.几乎所有我经历过的教程只涉及到评论的表面,而不是在django中讨论线程评论.我想要一些经验丰富/专业的建议,告诉我可能做错了什么,以及我可以做得更好.我想要的最后一件事就是在经过数小时的工作后发现有一种更可接受的方式.

所以,这里列出了我需要明确的内容:

  1. Django的MPTT:

    • 我之所以选择这个,是因为我可以负担得起更慢 我的网站将有更多的读取而不是写入.这个选项对我的情况好吗?还有一个我不知道的更好的选择吗?
    • 如果我的网站最终有很多评论活动,我该怎么办?我该怎么做才能优化树木重组?或者我会更好地切换到邻接列表?
    • 我的MPTT评论模型有一个以自己为引用的ForeignKey(用于回复).这是正确的方法吗?或者我应该创建一个单独的回复模型?
    • 我在树中插入对另一个用户注释的回复的方式是使用mptt递归模板标记内的表单中的隐藏输入,并返回输入值(回复所针对的注释的id)并设置对该输入值的回复的父级.这是一种可接受的方法吗?
  2. 一个html页面上有多个表单

    • 我的博客文章html页面上有两个表单.一个评论博客文章,一个回复用户的评论.这被接受了吗?或者我应该为不同的表单创建不同的URL和查看功能?我是这样做的,因为我想要一个reddit风格的评论系统.我不希望它必须去另一个页面评论或回复.
    • 如果用户对我的博客帖子发表评论,则回复表单中的隐藏输入值不会返回任何内容,因此在尝试将其分配给views.py函数中的变量时会出现错误.我使用try/except块来修复它.这有更好的方法吗?

对不起,如果这些是菜鸟问题,我的帖子就这么久了.我只想用最好的方法为初学者使用现实的解决方案.任何反馈都会有帮助.谢谢!这是我的博客应用程序的代码.

models.py

    from django.db import models

    from mptt.models import MPTTModel, TreeForeignKey

    class Post(models.Model):
        """Blog post"""
        title = models.CharField(max_length=200)
        body = models.TextField()
       date_added = models.DateTimeField(auto_now_add=True)

        def __str__(self):
            return self.body[:50] + '...'

    class Comment(MPTTModel):
        """User comment"""
        post = models.ForeignKey(Post, related_name='comments',on_delete=models.CASCADE)
        parent = TreeForeignKey('self', null=True, blank=True, related_name='children',db_index=True, on_delete=models.CASCADE)

        user_comment = models.CharField(max_length=500, unique=True)
        date_added = models.DateTimeField(auto_now_add=True)
        # approved = models.BooleanField(default=False)

        class MPTTMeta:
            order_insertion_by = ['date_added']

        def __str__(self):
            return self.user_comment[:20]
Run Code Online (Sandbox Code Playgroud)

"已批准"已被注释掉,因为出于某种奇怪的原因我得到了"没有这样的列:已批准"错误.

forms.py

    from django …
Run Code Online (Sandbox Code Playgroud)

python django threaded-comments django-mptt

18
推荐指数
1
解决办法
1906
查看次数

Rails的Reddit样式嵌套/线程/缩进注释?

我想知道是否有人已经在Rails中构建了一个用于线程注释的系统(因为缺少一个更好的术语),或者我是否需要自己构建它.

如果不清楚,我所指的是像Reddit那样的评论系统会自动缩进回复,使它们看起来像树的分支(最好像Reddit一样进行投票).

如果有人能指出我这样做的代码,我将不胜感激.

或者也许有一个包含此功能的开源项目.

到目前为止,我还没有在Rails中找到一个.

另外,最好在Rails论坛上问这个,如果是的话,哪一个?(我是Rails的新手)

ruby-on-rails reddit acts-as-tree threaded-comments

14
推荐指数
1
解决办法
7221
查看次数

从数据库中获取节点树以进一步渲染的最佳实践是什么?

假设我们有一个包含用户评论的表格.第一级评论引用了他们所附的文章.更深层次的注释没有设计引用,但它们引用了它的父注释.

对于这个数据库结构 - 获取给定文章的所有注释然后以html格式呈现它的最有效方法是什么?(假设我们有大约200条第一级的评论和最深的20级评论)

mysql threaded-comments hierarchical-data

6
推荐指数
2
解决办法
2988
查看次数

Scala Play Framework模板中的递归块

我正在为博客文章编写一个模板,该文章有线程评论.一种为线程注释编写模板的自然方法,它使用递归方式构造Html.像这样的东西:

@showComment(comment: models.Comment) = {
    <div class="comment">
        <div class="comment-metadata">
            <span class="comment-author">by @comment.author,</span>
            <span class="comment-date">
                @comment.postedAt.format("dd MMM yy")
            </span>
        </div>
        <div class="comment-content">
            <div class="about">Detail: </div>
            @Html(comment.content.replace("\n", "<br>"))
        </div>
        <a href="@action(controllers.Application.replyComment(comment.id()))">Reply</a>
        @comments filter { c => c.parent_id == comment.id } map { 
            c => @showComment(c)
        }
    </div>
}
Run Code Online (Sandbox Code Playgroud)

问题是使用递归块会产生错误:

引发的错误是:递归方法showComment需要结果类型

如果我尝试在showComment中放置一个返回类型,它会引发这个错误:

引发的错误是:找不到:值showComment

任何解决方法?

scala threaded-comments playframework

6
推荐指数
1
解决办法
1789
查看次数

Django线程评论和投票

我在我的项目中使用django-threadedcomments和django-voting来实现类似Reddit的评论投票系统.

我已经正确设置了所有内容,并且我能够成功记录每个线程评论及其子项的投票,但是我对如何对评论进行排序感到困惑,以便评分最高的评论上升到顶部.

通过模板标签会是一个解决方案吗?我试过这个并返回了一个列表,其中的项目按score降序排序,但是评论的父子关系搞砸了.这是我做的:

class OrderByVotesNode(template.Node):
    def __init__(self, queryset_var, direction="desc"):
        self.queryset_var = template.Variable(queryset_var)
        self.direction = direction

    def render(self, context):
    key = self.queryset_var.var
    value = self.queryset_var.resolve(context)
    try:
        direction = template.Variable(self.direction).resolve(context)
    except template.VariableDoesNotExist:
        direction = "desc"
    model = value.model
    qn = connection.ops.quote_name
    ctype = ContentType.objects.get_for_model(model)
    by_score = model.objects.filter(id__in=[f.id for f in value]).extra(select={"score": """
            SELECT coalesce(SUM(vote), 0 )
            FROM %s
            WHERE content_type_id = %s
            AND object_id = %s.%s
        """ % (qn(Vote._meta.db_table), ctype.id, qn(model._meta.db_table), qn(model._meta.pk.attname))},
        order_by=[(direction == "desc" and "-" or "") + …
Run Code Online (Sandbox Code Playgroud)

django threaded-comments django-voting

5
推荐指数
1
解决办法
1312
查看次数

Django通过向上/向下投票进行线程评论(如Hacker News或Reddit)

我是Django的新手.我正在尝试在Django中构建一个讨论应用程序,像Reddit和Hacker News一样,是完全线程化的,并通过上/下投票对每个评论进行排序.

我一直在使用django投票应用程序,并希望尽可能继续使用它.

我的models.py的简化版本是:

Class Comment(models.Model):
    text = models.TextField()
    user = models.ForeignKey(User)
    parent = models.ForeignKey('self', related_name='children', null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)

因为我正在使用django-voting应用程序,所以我可以获得任何特定评论的"得分"(upvotes minus downvotes),如下所示:

comment = Comment.objects.get(pk=1) # Grab the comment with primary key = 1
score = Vote.objects.get_score(comment)["score"]
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何:(a)在一个视图中准备数据,格式可以转换为模板中的线程讨论,以及(b)如何按照排序的方式这样做upvotes.

对这两个问题的任何帮助将不胜感激.

我愿意使用另一种方法,比如mptt,来构建评论树 - 但我仍然不清楚如何在django-mptt应用程序中通过upvote进行排序.

谢谢!

编辑: 我已经提出了我自己的,非常黑客的解决方案.我不打算将这个问题标记为已回答,因为我不认为这是在生产中使用的那种解决方案(我希望自己不会在生产中使用它).但是,万一有人在寻找一个解决方案,我希望这是有帮助的:

在我的views.py中,我创建了一个函数,在给定对象的查询集的情况下,通过投票输出排序列表:

def list_sorted_by_score(query_set):
    sorted_score_list = []

    # First, I create a list of all the objects with their associated scores
    for object in query_set:
        # django-voting's get_score outputs a dictionary that looks like:
        # …
Run Code Online (Sandbox Code Playgroud)

django threaded-comments django-voting

5
推荐指数
0
解决办法
1540
查看次数

Microsoft Excel中的OpenXML以获得注释

我正在运行最新的Office 365 Excel版本1901。我已经更新到最新的OpenXml SDK,但是由于我看到的是完整的摘要注释,因此无法弄清楚如何以编程方式读取有关线程注释的信息。即使使用最新的OpenXml Nuget软件包。

如果将Excel文档转换为.zip文件,则可以看到具有所需内容的“ threadedComments.xml”文件,但不知道如何在C#.NET中以编程方式进行处理。

c# excel openxml threaded-comments office365

5
推荐指数
1
解决办法
256
查看次数

最有效的数据结构来表示Java中的线程注释?

我想用Java 表示线程注释.这看起来类似于reddit.com上的注释的方式

hello
   hello
      hello
      hello
   hello
   hello
      hello
Run Code Online (Sandbox Code Playgroud)

如上例所示,响应嵌套在HTML中,并带有适当的缩进,以反映它们与先前注释的关系.

用Java表示这个的有效方法是什么?

我认为某种树数据结构是合适的.

但有没有一个特别是最有效的最小化树遍历?

如果我对每条评论进行投票,这将非常重要.因为在每次投票之后树需要重新排序 - 计算上可能是昂贵的操作.

顺便说一下,如果有人知道Java中的这个开源现有实现,那也会有所帮助.

java tree reddit threaded-comments data-structures

4
推荐指数
1
解决办法
3171
查看次数

需要有关缩进的线程注释的html/css结构的建议

我希望在我的应用中有一个评论部分,如下所示:

response1
 response1a
 response1b
  response1b1
response2
 response2a
 response2b
 response2c
  response2c1
   response2c1a
    response2c1a1
     response2c1a1
      response2c1a1a
       response2c1a1a1
Run Code Online (Sandbox Code Playgroud)

我相信它被称为线程评论.您可能已经在许多在线讨论网站上看到过这种格式,例如reddit.

我想知道的是如何在我的应用程序的HTML中实现这一点?

什么类型的html/css组合最适合允许这种类型的应用程序确定的缩进?

html css threaded-comments

4
推荐指数
2
解决办法
3578
查看次数

Django threadcomments - 我如何回复评论?

我正在尝试将threadedcommetns集成到我的Django应用程序中,并且无法理解它是如何工作的.以下是我的模板外观(基于教程中的示例):

<h3>Comments on This Post:</h3>
{% get_threaded_comment_tree for post as tree %}
{% for comment in tree %}
    <div style="margin-left: {{ comment.depth }}em;" class="comment">
        {% link_to_profile comment.user %}
        {% auto_transform_markup comment %}
    </div>
{% endfor %}
<p>Reply to Original:</p>
<form method="POST" action="{% get_comment_url post %}">
    {% csrf_token %}
    <ul>
        {% get_threaded_comment_form as form %}
        {{ form.as_ul }}
        <li><input type="submit" value="Submit Comment" /></li>
    </ul>
</form>
Run Code Online (Sandbox Code Playgroud)

那么,如果这些是线程评论,我如何回复某人已经留下的评论?形式在哪里?我只是设法得到Reply to Original表单,但有了这个,评论根本没有线程.

我非常感谢你的帮助.

PS实际上,我不太高兴这个应用程序如何与django 1.3一起工作,所以建议一个替代方案也是一个很好的答案.

django threaded-comments

3
推荐指数
1
解决办法
3022
查看次数

asp.net线程评论?

我正在开发ASP.net 4.0和sql server 2008中的博客,并想学习如何创建一个线程评论系统.通过线程我的意思是每个注释都有一个回复链接,注释在注释下缩进,它是一个回复.因此,您可以回复文章本身或回复任何评论.

这在论坛和博客上很常见,但我找不到任何可以解释和展示代码示例的文章.

以下是我创建的内容,但它仅适用于一个深度级别.我想让它递归,所以深度水平没有限制:我怎样才能做到这一点?任何建议,带有代码示例的文章都会很棒!

注释数据库表

commentId
parentId
postId
date
author
authorEmail
authorURL
authorIP
content
IsApproved
Run Code Online (Sandbox Code Playgroud)

ASP.NET标记:

<asp:ListView ID="ListView1" runat="server" onitemdatabound="ListView1_ItemDataBound">
<ItemTemplate>
    <div class="commentwrap">
        <div class="commentsTitleArea">
            <span class="commentCounter"><%# Convert.ToInt32(Container.DisplayIndex) + 1%>. </span>&nbsp;&nbsp;<img src="../images/decoy-icon-16px.png" alt="Comment by..." title="Comment by..." class="blogCommentIcon" /><a href='<%# Eval("AuthorUrl")%>' target="_blank" rel="nofollow"><%# " " + Eval("Author")%></a>&nbsp;&nbsp;<%# Eval("Date")%></div>
        <div class="commentText">
            <%# Eval("Content") %>
            <div><span class="btnCommentReply"><a href='<%# "article.aspx?article=" + Request.QueryString["article"] + "&amp;cid=" + Eval("commentId") + "#comment" %>'>REPLY</a></span></div>
        </div>
        <asp:ListView ID="ListView2" runat="server">
            <ItemTemplate>
                <div class="commentwrap commentNest">
                    <div class="commentsTitleArea">
                        <span class="commentCounter"><%# Convert.ToInt32(Container.DisplayIndex) …
Run Code Online (Sandbox Code Playgroud)

sql asp.net threaded-comments c#-4.0

1
推荐指数
1
解决办法
2274
查看次数

针对线程评论的可扩展解决方案

我不确定如何在PHP和MySQL中创建一个可以一次处理数百条注释的线程评论系统.

这样的事情是我唯一能想到的

$query = execute_query...('SELECT * FROM `comments` WHERE `post` = "1"');
foreach($query as $comment){
    $replies = execute_query...('SELECT * FROM `comment_replies` WHERE `comment` = "' . $comment['id'] . '"');
    if($replies){
        echo $comment['body']; //....
        foreach($replies as $reply){ /*....*/ }
    }
    else{
        echo $comment['body'];
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我需要有关数据库结构的提示以及如何在考虑性能的情况下检索所有线程注释请:)

php mysql threaded-comments

0
推荐指数
1
解决办法
2410
查看次数