我正在使用Django开发一个博客网站.我的网站将允许用户评论我的任何博客文章,并相互回复,并将使用"线程评论"结构显示(我还没有启动用户功能,只是评论).我已经使用django-mptt(至少,现在)使用线程注释正常工作,但如果我正在采取的路线或步骤方向正确,我没有CLUE.几乎所有我经历过的教程只涉及到评论的表面,而不是在django中讨论线程评论.我想要一些经验丰富/专业的建议,告诉我可能做错了什么,以及我可以做得更好.我想要的最后一件事就是在经过数小时的工作后发现有一种更可接受的方式.
所以,这里列出了我需要明确的内容:
Django的MPTT:
一个html页面上有多个表单
对不起,如果这些是菜鸟问题,我的帖子就这么久了.我只想用最好的方法为初学者使用现实的解决方案.任何反馈都会有帮助.谢谢!这是我的博客应用程序的代码.
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) 我想知道是否有人已经在Rails中构建了一个用于线程注释的系统(因为缺少一个更好的术语),或者我是否需要自己构建它.
如果不清楚,我所指的是像Reddit那样的评论系统会自动缩进回复,使它们看起来像树的分支(最好像Reddit一样进行投票).
如果有人能指出我这样做的代码,我将不胜感激.
或者也许有一个包含此功能的开源项目.
到目前为止,我还没有在Rails中找到一个.
另外,最好在Rails论坛上问这个,如果是的话,哪一个?(我是Rails的新手)
假设我们有一个包含用户评论的表格.第一级评论引用了他们所附的文章.更深层次的注释没有设计引用,但它们引用了它的父注释.
对于这个数据库结构 - 获取给定文章的所有注释然后以html格式呈现它的最有效方法是什么?(假设我们有大约200条第一级的评论和最深的20级评论)
我正在为博客文章编写一个模板,该文章有线程评论.一种为线程注释编写模板的自然方法,它使用递归方式构造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
任何解决方法?
我在我的项目中使用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的新手.我正在尝试在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) 我正在运行最新的Office 365 Excel版本1901。我已经更新到最新的OpenXml SDK,但是由于我看到的是完整的摘要注释,因此无法弄清楚如何以编程方式读取有关线程注释的信息。即使使用最新的OpenXml Nuget软件包。
如果将Excel文档转换为.zip文件,则可以看到具有所需内容的“ threadedComments.xml”文件,但不知道如何在C#.NET中以编程方式进行处理。
我想用Java 表示线程注释.这看起来类似于reddit.com上的注释的方式
hello
hello
hello
hello
hello
hello
hello
Run Code Online (Sandbox Code Playgroud)
如上例所示,响应嵌套在HTML中,并带有适当的缩进,以反映它们与先前注释的关系.
用Java表示这个的有效方法是什么?
我认为某种树数据结构是合适的.
但有没有一个特别是最有效的最小化树遍历?
如果我对每条评论进行投票,这将非常重要.因为在每次投票之后树需要重新排序 - 计算上可能是昂贵的操作.
顺便说一下,如果有人知道Java中的这个开源现有实现,那也会有所帮助.
我希望在我的应用中有一个评论部分,如下所示:
response1
response1a
response1b
response1b1
response2
response2a
response2b
response2c
response2c1
response2c1a
response2c1a1
response2c1a1
response2c1a1a
response2c1a1a1
Run Code Online (Sandbox Code Playgroud)
我相信它被称为线程评论.您可能已经在许多在线讨论网站上看到过这种格式,例如reddit.
我想知道的是如何在我的应用程序的HTML中实现这一点?
什么类型的html/css组合最适合允许这种类型的应用程序确定的缩进?
我正在尝试将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一起工作,所以建议一个替代方案也是一个很好的答案.
我正在开发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> <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> <%# Eval("Date")%></div>
<div class="commentText">
<%# Eval("Content") %>
<div><span class="btnCommentReply"><a href='<%# "article.aspx?article=" + Request.QueryString["article"] + "&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) 我不确定如何在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)
所以我需要有关数据库结构的提示以及如何在考虑性能的情况下检索所有线程注释请:)