
1 评论的render显示
1.1 后端#
def article_detail(request, username, id):
article = models.Article.objects.filter(id=id).first()
comment_list=article.commit_set.all()
return render(request, 'article.html', {'article': article, 'username': username,'comment_list':comment_list})
1.2 前端#
<div>
<h3>评论列表h3>
<div>
<ul class="list-group">
{% for comment in comment_list %}
<li class="list-group-item">
<div style="margin-bottom: 5px">
<span>#{{ forloop.counter }}楼span>
<span>{{ comment.create_time|date:'Y-m-d H:i:s' }}span>
<span><a href="/{{ comment.user.username }}">{{ comment.user.username }}a>span>
<span class="pull-right"><a href="">回复a>span>
div>
<div>
{% if comment.commit_id %}
<div class="well well-sm">
<p>@{{ comment.commit_id.user.username }}p>
<p>{{ comment.commit_id.content }}p>
div>
{% endif %}
{{ comment.content }}
div>
li>
{% endfor %}
ul>
div>
div>
2 根评论的ajax提交和显示
$('#id_btn_submit').click(function () {
$.ajax({
url: '/comment/',
method: 'post',
data: {article_id:'{{ article.id }}',content:$('#id_textarea').val(), 'csrfmiddlewaretoken': '{{ csrf_token }}'},
success:function (data) {
console.log(data)
if(data.status==100){
let username=data.username
let res_content=data.res_content
let res=`
<li class="list-group-item">
<div class="glyphicon glyphicon-headphones"><span> ${username}</span></div>
<div>
${res_content}
</div>
</li>`
//把这个字符串追加到
$('.list-group').append(res)
//清空输入框
$('#id_textarea').val('')
}
}
})
})
3 评论后端
def comment(request):
if request.is_ajax():
article_id=request.POST.get('article_id')
content=request.POST.get('content')
res=models.Commit.objects.create(user=request.user,article_id=article_id,content=content)
return JsonResponse({'status':100,'msg':'评论成功','username':request.user.username,'res_content':res.content})
4 子评论ajax提交和显示
4.1 后端#
def comment(request):
if request.is_ajax():
respone = {'status': 100, 'msg': '评论成功'}
article_id = request.POST.get('article_id')
content = request.POST.get('content')
parent_id = request.POST.get('parent_id')
res = models.Commit.objects.create(user=request.user, article_id=article_id, content=content,
commit_id_id=parent_id)
respone['username'] = request.user.username,
respone['res_content'] = res.content
if parent_id:
respone['parent_name'] = res.commit_id.user.username
respone['parent_content'] = res.commit_id.content
return JsonResponse(respone)
4.2 前端#
var parent_id=''
$('#id_btn_submit').click(function () {
let content=$('#id_textarea').val()
if(parent_id){
let count=content.indexOf('\n')+1
content=content.slice(count)
console.log(content)
}
$.ajax({
url: '/comment/',
method: 'post',
data: {
article_id: '{{ article.id }}',
content:content ,
'csrfmiddlewaretoken': '{{ csrf_token }}',
'parent_id':parent_id
},
success: function (data) {
console.log(data)
if (data.status == 100) {
let username = data.username
let res_content = data.res_content
let res=''
if(parent_id){
let parent_name=data.parent_name
let parent_content=data.parent_content
res = `
${username}
@${parent_name}--${parent_content}
${res_content}
\`
`
}
else {
res = `
${username}
${res_content}
`
}
$('.list-group').append(res)
$('#id_textarea').val('')
parent_id=''
}
}
})
})
$('.reply_span').click(function () {
let username=$(this).attr('username')
$('#id_textarea').val('@'+username+'\n').focus()
parent_id=$(this).attr('parent_id')
})
5 后台管理首页文章显示
5.1 前端#
{% extends 'backend/backend_base.html' %}
{% block article %}
<table class="table table-striped">
<thead>
<tr>
<th>文章id</th>
<th>文章标题</th>
<th>文章作者</th>
<th>点赞数</th>
<th>点踩数</th>
<th>操作</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for article in article_list%}
<tr>
<th scope="row">{{ article.id }}</th>
<td><a href="/{{ article.blog.userinfo.username }}/articles/{{ article.id }}.html">{{ article.title }}</a></td>
<td>{{ article.blog.userinfo.username }}</td>
<td>{{ article.up_num }}</td>
<td>{{ article.down_num }}</td>
<td><a href="">删除</a></td>
<td><a href="">编辑</a></td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
5.2 后端#
@login_required(login_url='/login/')
def backend(request):
article_list = models.Article.objects.filter(blog=request.user.blog)
return render(request, 'backend/backend_index.html', locals())
6 新增文章(富文本编辑器,xss攻击)
@login_required(login_url='/login/')
def add_article(request):
if request.method == 'GET':
category_list = models.Category.objects.filter(blog=request.user.blog)
tag_list = models.Tag.objects.filter(blog=request.user.blog)
return render(request, 'backend/add_article.html', locals())
else:
title = request.POST.get('title')
content = request.POST.get('content')
soup = BeautifulSoup(content, 'html.parser')
desc = soup.text[:250]
script_list = soup.find_all('script')
for script in script_list:
print('删了一个')
script.decompose()
category_id = request.POST.get('category')
tag_ids = request.POST.getlist('tag')
article = models.Article.objects.create(title=title, desc=desc, content=str(soup), blog=request.user.blog,
category_id=category_id)
tag_list = []
for tag_id in tag_ids:
tag_list.append(models.TagToArticle(tag_id=tag_id, article_id=article.id))
models.TagToArticle.objects.bulk_create(tag_list)
return redirect('/backend/')
7 富文本编辑器上传图片
7.1 前端#
KindEditor.ready(function (K) {
window.editor = K.create('#id_textarea', {
width: '100%',
height: '600px',
resizeType: 1,
uploadJson:'/upload_img/',
extraFileUploadParams : {
csrfmiddlewaretoken:'{{ csrf_token }}'
}
});
});
7.2 后端#
def upload_img(request):
print(request.FILES)
try:
myfile = request.FILES.get('imgFile')
path = os.path.join(settings.MEDIA_ROOT, 'img')
with open('%s/%s' % (path, myfile.name), 'wb') as f:
for line in myfile:
f.write(line)
return JsonResponse({"error": 0, "url": '/media/img/'+myfile.name})
except Exception as e:
return JsonResponse({"error": 1,"message": str(e)})
8django发送邮件
EMAIL_HOST = 'smtp.qq.com'
EMAIL_PORT = 465
EMAIL_HOST_USER = '306334678@qq.com'
EMAIL_HOST_PASSWORD = ''
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
EMAIL_USE_SSL = True
from django.core.mail import send_mail
send_mail("邮件标题" ,'邮件内容',settings.EMAIL_HOST_USER,["2277194535@qq.com"])
https://www.cnblogs.com/liuqingzheng/articles/10072695.html

1 评论的render显示
1.1 后端#
def article_detail(request, username, id):
article = models.Article.objects.filter(id=id).first()
comment_list=article.commit_set.all()
return render(request, 'article.html', {'article': article, 'username': username,'comment_list':comment_list})
1.2 前端#
<div>
<h3>评论列表h3>
<div>
<ul class="list-group">
{% for comment in comment_list %}
<li class="list-group-item">
<div style="margin-bottom: 5px">
<span>#{{ forloop.counter }}楼span>
<span>{{ comment.create_time|date:'Y-m-d H:i:s' }}span>
<span><a href="/{{ comment.user.username }}">{{ comment.user.username }}a>span>
<span class="pull-right"><a href="">回复a>span>
div>
<div>
{% if comment.commit_id %}
<div class="well well-sm">
<p>@{{ comment.commit_id.user.username }}p>
<p>{{ comment.commit_id.content }}p>
div>
{% endif %}
{{ comment.content }}
div>
li>
{% endfor %}
ul>
div>
div>
2 根评论的ajax提交和显示
$('#id_btn_submit').click(function () {
$.ajax({
url: '/comment/',
method: 'post',
data: {article_id:'{{ article.id }}',content:$('#id_textarea').val(), 'csrfmiddlewaretoken': '{{ csrf_token }}'},
success:function (data) {
console.log(data)
if(data.status==100){
let username=data.username
let res_content=data.res_content
let res=`
<li class="list-group-item">
<div class="glyphicon glyphicon-headphones"><span> ${username}</span></div>
<div>
${res_content}
</div>
</li>`
//把这个字符串追加到
$('.list-group').append(res)
//清空输入框
$('#id_textarea').val('')
}
}
})
})
3 评论后端
def comment(request):
if request.is_ajax():
article_id=request.POST.get('article_id')
content=request.POST.get('content')
res=models.Commit.objects.create(user=request.user,article_id=article_id,content=content)
return JsonResponse({'status':100,'msg':'评论成功','username':request.user.username,'res_content':res.content})
4 子评论ajax提交和显示
4.1 后端#
def comment(request):
if request.is_ajax():
respone = {'status': 100, 'msg': '评论成功'}
article_id = request.POST.get('article_id')
content = request.POST.get('content')
parent_id = request.POST.get('parent_id')
res = models.Commit.objects.create(user=request.user, article_id=article_id, content=content,
commit_id_id=parent_id)
respone['username'] = request.user.username,
respone['res_content'] = res.content
if parent_id:
respone['parent_name'] = res.commit_id.user.username
respone['parent_content'] = res.commit_id.content
return JsonResponse(respone)
4.2 前端#
var parent_id=''
$('#id_btn_submit').click(function () {
let content=$('#id_textarea').val()
if(parent_id){
let count=content.indexOf('\n')+1
content=content.slice(count)
console.log(content)
}
$.ajax({
url: '/comment/',
method: 'post',
data: {
article_id: '{{ article.id }}',
content:content ,
'csrfmiddlewaretoken': '{{ csrf_token }}',
'parent_id':parent_id
},
success: function (data) {
console.log(data)
if (data.status == 100) {
let username = data.username
let res_content = data.res_content
let res=''
if(parent_id){
let parent_name=data.parent_name
let parent_content=data.parent_content
res = `
${username}
@${parent_name}--${parent_content}
${res_content}
\`
`
}
else {
res = `
${username}
${res_content}
`
}
$('.list-group').append(res)
$('#id_textarea').val('')
parent_id=''
}
}
})
})
$('.reply_span').click(function () {
let username=$(this).attr('username')
$('#id_textarea').val('@'+username+'\n').focus()
parent_id=$(this).attr('parent_id')
})
5 后台管理首页文章显示
5.1 前端#
{% extends 'backend/backend_base.html' %}
{% block article %}
<table class="table table-striped">
<thead>
<tr>
<th>文章id</th>
<th>文章标题</th>
<th>文章作者</th>
<th>点赞数</th>
<th>点踩数</th>
<th>操作</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for article in article_list%}
<tr>
<th scope="row">{{ article.id }}</th>
<td><a href="/{{ article.blog.userinfo.username }}/articles/{{ article.id }}.html">{{ article.title }}</a></td>
<td>{{ article.blog.userinfo.username }}</td>
<td>{{ article.up_num }}</td>
<td>{{ article.down_num }}</td>
<td><a href="">删除</a></td>
<td><a href="">编辑</a></td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
5.2 后端#
@login_required(login_url='/login/')
def backend(request):
article_list = models.Article.objects.filter(blog=request.user.blog)
return render(request, 'backend/backend_index.html', locals())
6 新增文章(富文本编辑器,xss攻击)
@login_required(login_url='/login/')
def add_article(request):
if request.method == 'GET':
category_list = models.Category.objects.filter(blog=request.user.blog)
tag_list = models.Tag.objects.filter(blog=request.user.blog)
return render(request, 'backend/add_article.html', locals())
else:
title = request.POST.get('title')
content = request.POST.get('content')
soup = BeautifulSoup(content, 'html.parser')
desc = soup.text[:250]
script_list = soup.find_all('script')
for script in script_list:
print('删了一个')
script.decompose()
category_id = request.POST.get('category')
tag_ids = request.POST.getlist('tag')
article = models.Article.objects.create(title=title, desc=desc, content=str(soup), blog=request.user.blog,
category_id=category_id)
tag_list = []
for tag_id in tag_ids:
tag_list.append(models.TagToArticle(tag_id=tag_id, article_id=article.id))
models.TagToArticle.objects.bulk_create(tag_list)
return redirect('/backend/')
7 富文本编辑器上传图片
7.1 前端#
KindEditor.ready(function (K) {
window.editor = K.create('#id_textarea', {
width: '100%',
height: '600px',
resizeType: 1,
uploadJson:'/upload_img/',
extraFileUploadParams : {
csrfmiddlewaretoken:'{{ csrf_token }}'
}
});
});
7.2 后端#
def upload_img(request):
print(request.FILES)
try:
myfile = request.FILES.get('imgFile')
path = os.path.join(settings.MEDIA_ROOT, 'img')
with open('%s/%s' % (path, myfile.name), 'wb') as f:
for line in myfile:
f.write(line)
return JsonResponse({"error": 0, "url": '/media/img/'+myfile.name})
except Exception as e:
return JsonResponse({"error": 1,"message": str(e)})
8django发送邮件
EMAIL_HOST = 'smtp.qq.com'
EMAIL_PORT = 465
EMAIL_HOST_USER = '306334678@qq.com'
EMAIL_HOST_PASSWORD = ''
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
EMAIL_USE_SSL = True
from django.core.mail import send_mail
send_mail("邮件标题" ,'邮件内容',settings.EMAIL_HOST_USER,["2277194535@qq.com"])
https://www.cnblogs.com/liuqingzheng/articles/10072695.html