url配置

url(r'^commentTree/(?P<article_id>\d+)/',views.commentTree),
url(r'^(?P<username>.*)/com', views.com),

视图:

def commentTree(request,article_id):
# 找到当前文章对应的所有的评论
comment_list = models.Comment.objects.filter(article_id=article_id).values("nid","content","parent_comment_id","user__username")
comment_dict = {}
for comment in comment_list:
comment["chidren_commentList"] = [] #添加一个字段
comment_dict[comment["nid"]] = comment #创建一个字典,字典的键为nid,值为评论 commentTree = []
for comment in comment_list:
pid = comment.get("parent_comment_id") #获取到父级评论的iD
if pid:
comment_dict[pid]["chidren_commentList"].append(comment) #吧该条记录添加到字典中 --------父级评论
else:
commentTree.append(comment) #没有获取到说明是根评论
print("==============>",comment_dict)
return HttpResponse(json.dumps(commentTree)) #串过去的是一个具有父子结构关系的字典
def com(request,username):
current_user = request.user
article_id = request.POST.get("article_id") # 当前的文章ID
content = request.POST.get("text") # 当前的评论内容
print("===============content>",content)
user_id = request.user.nid
parent_comment_id = request.POST.get("parent_comment_id")
response = {"success":False}
print("===========>可以走到这里")
if request.POST.get("parent_comment_id"): #可以去到父级ID,为父级的评论
with transaction.atomic():
comment_obj = models.Comment.objects.create(content=content, user_id=user_id, article_id=article_id,
parent_comment_id=parent_comment_id)
response["success"] = True
response["parent_comment_username"]=comment_obj.parent_comment.user.username
response["parent_comment_content"]=comment_obj.parent_comment.content
response["comment_id"] = comment_obj.nid
else: #这里娶不到,为根评论
print("===============>根评论")
with transaction.atomic():
comment_obj= models.Comment.objects.create(content=content, user_id=user_id, article_id=article_id)
response["success"] = True
response["comment_id"] = comment_obj.nid return HttpResponse(json.dumps(response))

前端页面

{% extends "homeSite.html" %}
{% block content %}
<div class="article_region">
<div class="row">
{# 文章的主体区域#}
<h3 class="title">{{ article_obj.title }}</h3>
<hr>
<div class="article_con">{{ article_obj.articledetail.content|safe }}</div>
</div>
<hr>
<div class="info pull-right">
<div class="row ">
{# 小按钮#}
{{ current_user }}
发表于 <span>{{ article_obj.create_time|date:"Y-m-d" }}</span>
<span>评论({{ article_obj.comment_count }})</span>
<span>点赞({{ article_obj.up_count }})</span>
<span>阅读({{ article_obj.read_count }})</span>
<a href="">编辑</a>
<a href="">收藏</a>
</div>
<br>
</div>
<br>
<br>
<br>
<hr>
{# 文章的分类和标签展示#}
<p>分类:<a href="">{{ current_blog.category_set.first.title }}</a></p>
<p>标签:{% for tag in current_blog.tag_set.all %}
<a href="">{{ tag.title }}</a>|
{% endfor %}
</p>
<div class="updown row">
{# 点赞块#}
<div class="author_profile">
<div id="author_profile_info" class="author_profile_info">
<a href="" target="_blank"><img src="{{ current_user.avatar.url }}" width="50" height="50" alt="" class="author_avatar"></a>
<div id="author_profile_detail" class="author_profile_info">
{# 头像快#}
<a href="">{{ current_user }}</a><br>
<a href="">关注--{{ current_user.fans.user }}</a><br>
<a href="">粉丝--{{ current_user.fans.follower }}</a><br>
</div>
</div>
</div>
<div class="buryit pull-right">
<span class="burynum" id="bury_count">{{ article_obj.down_count }}</span>
</div> <div class="diggit pull-right">
<span class="diggnum" id="digg_count">{{ article_obj.up_count }}</span>
</div>
</div>
<span class="diggnum_error pull-right"></span>
{# 错误提示#}
<hr>
<div></div>
<hr>
<div class="comment_count">
<h5>评论树</h5>
<div class="comment_tree_list"> </div> <p>评论列表:</p>
<div class="contcont"> 所有的评论楼层
{% for comment in comment_obj_list %} <div class="row pl">
<div class="col-md-12">
<div class="row">
<div class="pull-left">
#
<div class="nb" style="display: inline-block">
&nbsp;&nbsp;{{ forloop.counter }}</div>
楼&nbsp;&nbsp;
{{ comment.create_time }}&nbsp;&nbsp;<a href="/blog/{{ comment.user.username }}"
class="sp">{{ comment.user.username }}</a>
</div>
<a href="" class="sendMsg2This"></a>
<div class="pull-right">
{% if request.user.username %}
<a class="reply" id="reply" comment_id="{{ comment.nid }}"
comment_username="{{ comment.user.username }}">回复</a>&nbsp;&nbsp;&nbsp;&nbsp;
{% else %}
{% endif %}
<a>引用</a>&nbsp;&nbsp;&nbsp;&nbsp;
{% if request.user.username %}
<a>删除</a>
{% else %}
{% endif %}
</div>
</div> <div style="background-color: white">
{% if comment.parent_comment_id %}
@<a href="">{{ comment.parent_comment.user.username }}
&nbsp;&nbsp;&nbsp;{{ comment.parent_comment.content|safe }}
</a>
{% endif %}
</div>
<div class="cont">{{ comment.content|safe }}</div>
<br>
</div>
</div> {% endfor %} </div>
<hr>
<div class="row pull-right">
{# 模仿博客园的,具体功能慢慢扩展#}
<a href="">刷新评论</a> <a href="">刷新页面</a> <a href="">返回顶部</a>
</div>
<br> </div> <div class="had_comment_region">
{# 发表评论的框框,暂时不太好看#}
<div id="commentform_title">发表评论</div>
<span id="tip_comment" style="color: red"></span>
<p><input type="text" id="tbCommentAuthor" class="author" disabled="disabled" size="50"
value="{{ request.user.username }}"></p>
<p>评论内容:</p>
<form>
{% csrf_token %}
<textarea id="comment_content" class="comment_content" name="content"
style="width:500px;height:300px;"></textarea>
</form>
<button class="submit" >提交</button>
</div>
</div> {# 辅助标签#}
<div class="infos" user_username="{{ request.user.username }}" article_id="{{ article_obj.nid }}"></div> <script>
{# KindEditor.options.filterMode = false;#}
KindEditor.ready(function (K) {
window.editor = K.create('#comment_content', {
width: "500px",
height: "300px",
resizeType: 0,
{# filterMode: false,#}
extraFileUploadParams: {
csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(),
},
items: [
'undo', 'redo', 'copy', 'paste', 'fontsize', '|', 'forecolor', 'hilitecolor', 'bold',
'italic', 'underline', 'strikethrough', 'hr', 'emoticons'
], });
})
</script> <script>
{# 建楼层用的#}
var nb = parseInt($(".nb:last").text()) + 1; {# 格式化时间#}
Date.prototype.Format = function (fmt) { //author: meizz
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"h+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}; var createTime = new Date().Format("yyyy-MM-dd hh:mm"); {# 提交评论#}
$(".submit").click(function () {
if (editor.html().charAt(0) != "@"){parent_comment_id = null}
if (parent_comment_id) {
{# 这里是直接回复回复#}
var index = editor.html().indexOf("\n")
cont = editor.html().slice(index + 1)
{# alert(index)#}
{# alert(cont)#}
{# 截取换行符第一次出现的地方的下一个点到结束 #}
} else {
cont = editor.html();
}
$.ajax({
url: "/blog/{{ current_user }}/com/",
type: "POST",
data: {
csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(),
article_id:{{ article_obj.nid }},
text: cont,
parent_comment_id: parent_comment_id
},
success: function (data) {
data = JSON.parse(data);
if (data["success"]) {
{# if有父级评论#}
if (parent_comment_id) {
var tr = '<div class="row pl">\
<div class="col-md-12">\
<div class="row">\
<div class="pull-left">\
#&nbsp;&nbsp;' + {{ forloop.counter }} + '&nbsp;楼&nbsp;&nbsp;' + createTime + '&nbsp;&nbsp;<a class="sp" href="">{{ user_obj }}</a>\
</div>\
<a href="" class="sendMsg2This"></a>\
<div class="pull-right"><a class="reply" id="reply" comment_id="' + data.comment_id + '" comment_username="' + data.parent_comment_username + '" >回复</a>&nbsp;&nbsp;&nbsp;&nbsp;<a >引用</a>&nbsp;&nbsp;&nbsp;&nbsp;<a >删除</a></div>\
</div>\
<div style="background-color: white">@<a href="">' + data.parent_comment_username + '\
&nbsp;&nbsp;&nbsp;' + data.parent_comment_content + '</a></div>\
<div class="cont">' + cont + '</div>\
<br>\
</div>\
</div>';
} else {
var tr = '<div class="row pl">\
<div class="col-md-12">\
<div class="row">\
<div class="pull-left">\
#&nbsp;&nbsp;' + {{ forloop.counter }} + '&nbsp;楼&nbsp;&nbsp;' + createTime + '&nbsp;&nbsp;<a class="sp" href="">{{ user_obj }}</a>\
</div>\
<a href="" class="sendMsg2This"></a>\
<div class="pull-right"><a class="reply" id="reply" comment="' + data.comment_id + '" comment_username="{{ request.user.username }}" >回复</a>&nbsp;&nbsp;&nbsp;&nbsp;<a >引用</a>&nbsp;&nbsp;&nbsp;&nbsp;<a >删除</a></div>\
</div>\
<div class="cont">' + cont + '</div>\
<br>\
</div>\
</div>';
} $(".contcont").append(tr); alert(cont)
editor.html("");
parent_comment_id = null; } else {
location.href = "/login/"
}
}
})
}); function foo() {
$(".diggnum_error").html("")
} {# 点赞踩踩,每次进来都会写cookie,前端获取到执行响应的操作#}
$(".diggit").click(function () {
if ($(".infos").attr("user_username")){
$.ajax({
url: "/blog/up_count/",
type: "POST",
data: {
csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(),
article_id:{{ article_obj.nid }}
},
success: function (data) {
data = JSON.parse(data);
if (data["state"]) {
var val = parseInt($("#digg_count").html()) + 1;
$("#digg_count").html(val)
} else {
$(".diggnum_error").html("请不要重复点赞").css("color", "red");
setTimeout(foo, 3000)
}
}
})
}else{
location.href="/login/"
} });
$(".buryit").click(function () {
if ($(".infos").attr("user_username")){
$.ajax({
url: "/blog/down_count/",
type: "POST",
data: {
csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(),
article_id:{{ article_obj.nid }}
},
success: function (data) {
data = JSON.parse(data);
{# console.log(data);#}
if (data["state"]) {
var val = parseInt($("#bury_count").html()) + 1;
$("#bury_count").html(val)
} else {
$(".diggnum_error").html("去你大爷的,").css("color", "red")
setTimeout(foo, 3000)
}
}
})
}else{
location.href="/login/"
} }); {# 回复按钮功能#}
{# var parent_comment_id = null;#}
{# $(".contcont").on("click", ".reply", function () {#}
{# var parent_user_username = $(this).attr("comment_username");#}
{# editor.sync();#}
{# editor.focus();#}
{# editor.appendHtml("@" + parent_user_username + "<br>")#}
{# parent_comment_id = $(this).attr("comment_id");#}
{# alert(parent_comment_id)#}
{##}
{# })#}
$(".comment_tree_list").on("click", ".reply", function () {
var parent_user_username = $(this).attr("comment_username");
editor.sync();
editor.focus();
editor.appendHtml("@" + parent_user_username + "<br>")
parent_comment_id = $(this).attr("comment_id");
alert(parent_comment_id) }) {# 获取到评论树#}
$.ajax({
url: "/blog/commentTree/{{ article_obj.nid }}/",
success: function (data) {
var data = JSON.parse(data);
var s = showCommentTree(data);
$(".comment_tree_list").append(s);
}
}) {# 评论树相关样添加式慢慢#} var numb = 0;
function showCommentTree(comment_list) {
var html = "";
numb +=1; $.each(comment_list, function (i, comment_dict) {
var count = comment_dict["content"];
var user = comment_dict["user__username"];
var parent_comment_id = comment_dict["parent_comment_id"];
var createTime = new Date().Format("yyyy-MM-dd hh:mm"); var comment_str = '<div class="comment media offset"><div class="content" >' +
'<div class="row" style="border: 1px dashed red">' +
'<div class="col-md-7 pull-left">#<div class="nbv" style="display: inline-block">'+numb+'</div>楼'+createTime+'__'+user+'<a href="" class="sendMsg2This"></a></div>' +
'<div class="col-md-5 pull-right"><a class="reply" id="reply" comment_id='+parent_comment_id+' comment_username='+user+'>回复</a>&nbsp;&nbsp;&nbsp;&nbsp;<a>引用</a>&nbsp;&nbsp;&nbsp;&nbsp;<a>删除</a>&nbsp;&nbsp;&nbsp;&nbsp;</div>' +
'</div><div class="row" style="border: 1px dashed blue">'+count+'</div></div>'; {# var comment_str = '<div class="media offset"><div class="media-left "><a href="/blog/' + comment_dict["user__username"] +#}
{# '/"><img class="media-object" src="/media/' + comment_dict["user__avatar"] + '" width="30" height="30" alt="..."></a></div>' +#}
{# '<div class="media-body"><div class="media-heading"><span>#' + comment_dict["nid"] + '楼</span><span>&nbsp;&nbsp;' +#}
{# comment_dict["comment_data"] + '</span><a href="/blog/' + comment_dict["user__username"] + '/"><span>&nbsp;&nbsp;' +#}
{# comment_dict["user__username"] + '</span></a><a class="reply_comment_btn pull-right" comment_id="' + comment_dict["nid"] +#}
{# '" conmment_username="' + comment_dict["user__username"] + '">回复</a></div><div class="content_box"><div class="c_content">' + comment_dict["content"] +#}
{# '</div><div class="comment_vote"></div></div></div>';#}
{##} {# 如果他有子列表,继续执行该函数#}
if (comment_dict["chidren_commentList"]) {
var s = showCommentTree(comment_dict["chidren_commentList"]);
comment_str += s;
}
comment_str += "</div>";
html += comment_str;
{# alert(html)#}
});
return html
} </script> {% endblock %} {% block page %}
{% endblock %} <script>
{# 建楼层用的#}
var nb = parseInt($(".nb:last").text()) + 1; {# 格式化时间#}
Date.prototype.Format = function (fmt) { //author: meizz
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"h+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}; var createTime = new Date().Format("yyyy年MM月dd日 hh:mm"); {# 提交评论#}
$(".submit").click(function () {
if ($("#comment_content").val().charAt(0) != "@") {
parent_comment_id = null
} if (parent_comment_id) {
{# 这里是直接回复回复#}
alert("评论回复");
{# var index = $("#comment_content").val().indexOf("\n");#}
var index = editor.html().indexOf("\n")
alert(index)
{# 找到换行符第一次出现的地方 #}
{# cont = $("#comment_content").val().slice(index + 1);#} cont = editor.html().slice(index+1)
{# 截取换行符第一次出现的地方的下一个点到结束 #}
alert(cont)
} else {
{# 这里只是单纯的回复#}
alert("单纯的回复");
{# cont = $("#comment_content").val()#}
cont = editor.html()
} {# 当前输入的内容#} $.ajax({
url: "/blog/{{ current_user }}/com/",
type: "POST",
data: {
csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(),
article_id:{{ article_obj.nid }},
text: cont,
parent_comment_id: parent_comment_id,
},
success: function (data) {
data = JSON.parse(data);
if (data["success"]) {
{# if有父级评论#}
if (parent_comment_id) {
var tr = '<div class="row pl">\
<div class="col-md-12">\
<div class="row">\
<div class="pull-left">\
#&nbsp;&nbsp;' + nb + '&nbsp;楼&nbsp;&nbsp;' + createTime + '&nbsp;&nbsp;<a class="sp" href="">{{ user_obj }}</a>\
</div>\
<a href="" class="sendMsg2This"></a>\
<div class="pull-right"><a class="reply" id="reply" comment_id="' + data.comment_id + '" comment_username="' + data.parent_comment_username + '" >回复</a>&nbsp;&nbsp;&nbsp;&nbsp;<a >引用</a>&nbsp;&nbsp;&nbsp;&nbsp;<a >删除</a></div>\
</div>\
<div style="background-color: white">@<a href="">' + data.parent_comment_username + '\
&nbsp;&nbsp;&nbsp;' + data.parent_comment_content + '</a></div>\
<div class="cont">' + cont + '</div>\
<br>\
</div>\
</div>';
} else {
var tr = '<div class="row pl">\
<div class="col-md-12">\
<div class="row">\
<div class="pull-left">\
#&nbsp;&nbsp;' + nb + '&nbsp;楼&nbsp;&nbsp;' + createTime + '&nbsp;&nbsp;<a class="sp" href="">{{ user_obj }}</a>\
</div>\
<a href="" class="sendMsg2This"></a>\
<div class="pull-right"><a class="reply" id="reply" comment="' + data.comment_id + '" comment_username="{{ request.user.username }}" >回复</a>&nbsp;&nbsp;&nbsp;&nbsp;<a >引用</a>&nbsp;&nbsp;&nbsp;&nbsp;<a >删除</a></div>\
</div>\
<div class="cont">' + cont + '</div>\
<br>\
</div>\
</div>';
} $(".contcont").append(tr); $(".comment_content").val("");
parent_comment_id = null; } else {
alert($.session.get("urls"));
location.href = "/login/"
}
}
})
}); function foo() {
$(".diggnum_error").html("")
} {# 正常用户#}
$(".diggit").click(function () {
$.ajax({
url: "/blog/up_count/",
type: "POST",
data: {
csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(),
article_id:{{ article_obj.nid }}
},
success: function (data) {
data = JSON.parse(data);
if (data["state"]) {
var val = parseInt($("#digg_count").html()) + 1;
$("#digg_count").html(val)
} else {
$(".diggnum_error").html("请不要重复点赞").css("color", "red");
setTimeout(foo, 3000)
}
}
})
}); $(".buryit").click(function () {
$.ajax({
url: "/blog/down_count/",
type: "POST",
data: {
csrfmiddlewaretoken: $("[name='csrfmiddlewaretoken']").val(),
article_id:{{ article_obj.nid }}
},
success: function (data) {
data = JSON.parse(data);
{# console.log(data);#}
if (data["state"]) {
var val = parseInt($("#bury_count").html()) + 1;
$("#bury_count").html(val)
} else {
$(".diggnum_error").html("去你大爷的,").css("color", "red")
setTimeout(foo, 3000)
}
}
})
}); {# 游客进来之后吧当前的url写到session中,跳转到login页面#}
$("#wu_diggnum").click(function () {
$.session.set("urls", window.location.href);
alert(window.location.href)
location.href = "/login/"
}); {# 回复按钮功能#}
var parent_comment_id = null;
$(".contcont").on("click", ".reply", function () {
{# alert(parent_comment_id);#}
var parent_user_username = $(this).attr("comment_username");
alert(parent_user_username)
{# location.href = "#comment_content";#}
{# $(".comment_content").focus();#}
editor.focus()
{# $(".comment_content").val("@" + parent_user_username + "\n");#}
editor.html("@" + parent_user_username + "\n")
parent_comment_id = $(this).attr("comment_id");
alert(parent_comment_id) {# alert(parent_comment_id);#}
}) {# 获取到评论树#}
$.ajax({
url: "/blog/commentTree/{{ article_obj.nid }}/",
success: function (data) {
var data = JSON.parse(data);
var s = showCommentTree(data);
$(".comment_tree_list").append(s);
}
}) function showCommentTree(comment_list) {
var html = "";
$.each(comment_list, function (i, comment_dict) {
var val = comment_dict["content"];
var comment_str = '<div class="comment"><div class="content"><span>' + val + '</span></div>';
if (comment_dict["chidren_commentList"]) {
var s = showCommentTree(comment_dict["chidren_commentList"]);
comment_str += s;
{# alert(comment_str)#}
}
comment_str += "</div>";
html += comment_str;
{# alert(html)#}
});
return html
} </script>

css相关样式

.title{
color: #2aabd2;
} .article_region .article_con{
margin-left: 20px;
} .updown .diggit{
width: 46px;
height: 52px;
background: url("/static/img/upup.gif") no-repeat;
text-align: center;
cursor: pointer;
margin-top: 2px;
padding-top: 5px;
} .updown .buryit{
margin-left:20px;
width: 46px;
height: 52px;
background: url("/static/img/downdown.gif") no-repeat;
text-align: center;
cursor: pointer;
margin-top: 2px;
padding-top: 5px;
}
/*.updown{*/
/*margin-left: 0;*/
/*}*/ .subComment_region #tbCommentAuthor{
background-position: 3px -3px;
background-image: url("/static/img/icon_form.gif");
background-repeat: no-repeat;
border: 1px solid #ccc;
padding: 4px 4px 4px 30px;
width: 300px;
font-size: 13px;
} #commentform_title {
background-image: url("/static/img/icon_addcomment.gif");
background-repeat: no-repeat;
padding: 0 0 0 25px;
margin-bottom: 10px;
}
.author_avatar{
margin-left: 20px;
} .had_comment_region input.author{
background-image: url("/static/img/icon_form.gif");
background-repeat: no-repeat;
border: 1px solid #ccc;
padding: 4px 4px 4px 30px;
width: 300px;
font-size: 13px;
} #author_profile {
float: left;
width: 280px;
margin-top: 0;
margin-bottom: 10px;
color: #000;
margin-left: 0;
font-size: 12px;
}
.author_profile_info {
float: left;
line-height: 18px;
}
div {
display: block;
} .author_avatar {
vertical-align: top;
float: left;
margin-right: 5px;
padding-top: 5px;
padding-left: 2px;
border: 0;
} .author_profile_info {
float: left;
line-height: 18px;
} .author_profile .author_profile_info .author_profile_detail a{
border-bottom: 2px dotted #333;
color: #000;
text-decoration: none;
} .sendMsg2This:link, .sendMsg2This:visited, .sendMsg2This:active {
font-size: 12px;
text-decoration: none;
background: url("/static/img/icoMsg.gif") no-repeat top left;
padding-left: 20px;
} .feedbackListSubtitle a:hover {
color: #f60;
text-decoration: none;
} .sendMsg2This:hover {
background: url("/static/img/icoMsg.gif") no-repeat bottom left;
} .sp:hover{
color: #f60;
text-decoration: none;
}
.sp {
color: #666;
font-weight: normal;
} .pl{
margin-left: 0;
margin-top: 3px;
border-bottom: 1px solid #EDD9B8;
} .comment{
margin-left: 20px;
}

博客系统-评论or评论树的更多相关文章

  1. Django之博客系统:增加评论

    3既然是博客,那肯定就有留言评论系统.在这一章就来建立一个评论系统. 1 创建一个模型来保存评论 2 创建一个表单来提交评论并且验证输入的数据 3 添加一个视图函数来处理表单和保存新的评论到数据库 4 ...

  2. Linux下使用 github+hexo 搭建个人博客05-next主题接入评论系统

    静态站点拥有一定的局限性,因此我们需要借助于第三方服务来扩展我们站点的功能. 而评论系统是最常用于和网站用户交流的,因此本章讲解在 next 主题,如何接入评论系统. 参考网站:Next 使用文档,第 ...

  3. Atitit qzone qq空间博客自动点赞与评论工具的设计与实现

    Atitit qzone qq空间博客自动点赞与评论工具的设计与实现 Qzone发送评论的原理 首先,有个a标签, <a class="c_tx3" href="j ...

  4. 为hexo博客添加基于gitment评论功能

    关于gitment gitment其实就是利用你的代码仓库的Issues,来实现评论.每一篇文章对应该代码仓库中的 一个Issues,Issues中的评论对应你的博客每篇文章中的评论.如果你是用git ...

  5. Android应用开发-小巫CSDN博客client之获取评论列表

    Android应用开发-小巫CSDN博客客户端之获取评论列表 上一篇博客介绍了博文具体内容的业务逻辑实现,本篇博客介绍小巫CSDN博客客户端的最后一项功能.获取评论列表,这个功能的实现跟前面获取文章列 ...

  6. 欢迎阅读daxnet的新博客:一个基于Microsoft Azure、ASP.NET Core和Docker的博客系统

    2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客.当然,我写博客也不是从2008年才开始的,在更早时候,也在CSDN和系统分析员协会(之后名为"希赛网" ...

  7. ASP.NET + EF + SQL Server搭建个人博客系统新手系列(一):界面展示

    第一次写博客,可能有些地方描述的不准确,还请大家将就.本人大四学生,学了半年C#,半年.net,但是很遗憾,学完之后只会写个hello word.老师教的过程中总是会套用一些模板,特别是后台,完全封装 ...

  8. 一个基于Microsoft Azure、ASP.NET Core和Docker的博客系统

    2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客.当然,我写博客也不是从2008年才开始的,在更早时候,也在CSDN和系统分析员协会(之后名为“希赛网”)个人空间发布过一些 ...

  9. 【完全开源】Django多人博客系统——支持MarkDown和tinyMce

    目录 说明 功能 如何使用 说明 这是一个用Django开发的多人博客系统,功能简单,但完全满足公司内部或个人的博客使用需求.支持普通富文本编辑器(tinyMCE)和MarkDown编辑器 由于嫌弃D ...

  10. 从零开始,搭建博客系统MVC5+EF6搭建框架(5),博客详情页、留言、轮播图管理、右侧统计博文

    一.博客系统进度回顾 上一遍博客介绍到,系统已经实现到了发布以及前台布局展示,接下来就是实现一些,详情页,留言.轮播图管理.右侧博文统计信息实现. 二.博客系统详情页实现 2.1先来看看详情页展示的效 ...

随机推荐

  1. localstorage与sessionstorage的使用

    cookie,sessionStorage,localeStorage的区别 cookie是存储在浏览器端,并且随浏览器的请求一起发送到服务器端的,它有一定的过期时间,到了过期时间自动会消失.sess ...

  2. 16,re模块的常用方法

    ret =re.findall('\d+', 'eva123egon4yuan567') print(ret)#返回满足条件的结果 ,放在一个列表里. ret2 = re.search('\d+',' ...

  3. numpy.clip(a, a_min, a_max, out=None)(values < a_min are replaced with a_min, and those > a_max with a_max.)

    numpy.clip(a, a_min, a_max, out=None) Clip (limit) the values in an array. Given an interval, values ...

  4. sql语句中的join连接(左连接、右连接、全连接、内连接)

    内部连接(inner join): select * from d_user a inner join D_ORGANIZATION b on a.COMPANY_XID=b.ID  内部链接也是排他 ...

  5. shell的echo命令

    echo是Shell的一个内部指令,用于在屏幕上打印出指定的字符串.命令格式: echo arg 您可以使用echo实现更复杂的输出格式控制. 显示转义字符 echo "\"It ...

  6. 【Luogu】P1144最短路计数(BFS)

    题目链接 此题使用BFS记录最短路的条数.思路如下:因为是无权无向图,所以只要被BFS到就是最短路径.因此可以记录该点的最短路和最短路的条数:如果点y还没被访问过,则记录dis[y],同时令ans[y ...

  7. 【leetcode最短路】818. Race Car

    https://leetcode.com/problems/race-car/description/ 1. BFS剪枝 0<=current position<=2*target.为什么 ...

  8. 【基础操作】FFT / DWT / NTT / FWT 详解

    1. 2. 点值表示法 假设两个多项式相乘后得到的多项式 的次数(最高次项的幂数)为 $n$.(这个很好求,两个多项式的最高次项的幂数相加就得到了) 对于每个点,要用 $O(n)$ 的时间 把 $x$ ...

  9. 服务器内部转发forward,action到action

    如果request.getRequestDispatcher();中不是页面而是传action的话,参考以下内容修改: web.xml 2.4版本里,默认的filter只拦截request. 如果使用 ...

  10. mark一下。hadoop分布式系统搭建

    用于测试,我用4台虚拟机搭建成了hadoop结构 我用了两个台式机.一个xp系统,一个win7系统.每台电脑装两个虚拟机,要不然内存就满了. 1.安装虚拟机环境 Vmware,收费产品,占内存较大. ...