ajax data传form.serialize()多个参数_Django建站历程:(十一)ajax实现文章添加评论...

news/2024/5/12 7:57:31/文章来源:https://blog.csdn.net/weixin_34229578/article/details/112091546

b2cb04a1e7fedd0171fa5a63c5e35673.png

为了结构清晰,我们新创建一个comment APP来做评论系统,如何创建和配置具体可以看前面的章节,这里就不详细写了。需要注意的是,本文只实现了对文章的评论,对于对评论进行回复和评论没有实现,其实实现方法类似,大家可以自己搞搞。

新增一个model,第一步老规矩,确认model的属性。

1、添加model属性

一个评论的属性很简单,大约有以下几点:评论所属文章、评论时间、评论内容、评论者。一个评论只属于一篇文章,而一篇文章可以有多个评论。修改model.py,创建评论的相关属性字段如下

from django.db import models
from django.conf import settings# Create your models here.class Comment(models.Model):owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name='评论人')body = models.TextField('评论内容')create_date = models.DateTimeField('评论时间', auto_now_add=True)belong = models.ForeignKey(settings.ARTICLE_MODEL, on_delete=models.CASCADE, related_name='articles_comments', verbose_name='所属文章')class Meta:verbose_name = '文章评论'verbose_name_plural = verbose_nameordering = ['create_date']

注意,需要全局setting中声明下ARTICLE_MODEL

ARTICLE_MODEL = 'blog.Article'

2、修改admin.py

修改如下代码用于评论字段的后台显示

from django.contrib import admin
from comment.models import Comment# Register your models here.@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):list_display = ['id', 'owner', 'body', 'create_date','belong']

3、同步数据库

root@jerryls-site1:/home/mysite# ./manage.py makemigrations
root@jerryls-site1:/home/mysite# ./manage.py migrate

此时,运行服务器进入后台即可看到评论字段

3a25af04d483d521811ff4d75167f30d.png

我们能先随便加一条评论用于显示。

c7787a753a6ccf633c95069369b3bfd5.png

4、创建模板文件

我们创建评论模板文件comment_list.html将评论按条显示出来,路径老规矩,在app/comment/templates/comment/下。代码类似文章列表的显示:

<div class="list-group"><a class="list-group-item disabled">评论</a>
{% for cmt in cmt_list %}<a class="list-group-item"><p><i>({{forloop.counter}}#)&nbsp;&nbsp;&nbsp;</i>{{cmt.owner}}:{{cmt.body}}</p><p class="text-right">{{cmt.create_date}}</p></a>
{% empty %}
<h4>暂时没有评论!</h4>
{% endfor %}
</div>

forloop.counter 可以打印出循环次数,我们用来做楼层显示。接下来修改views.py,将cmt_list传进来。

5、添加视图和路由

直接把评论列表放在文章后面即可,无需单独的视图和路由。修改article_view如下:

from comment.models import Commentdef article_view(request, slug):article = get_object_or_404(Article, slug=slug)  #获取该slug的文章cmt_list = Comment.objects.filter(belong = article)  #获取该文章的所有评论return render(request,'blog/article_detail.html', {'article':article, 'cmt_list':cmt_list})   # 返回article_detail.html页面

将comment_list.html文件连接到文章主体之下:

{% include 'comment/comment_list.html'%}

此时运行服务器,就可以看到文章下面的评论列表啦!

92cc8076aebcce855db552f68b30380d.png

下面我们加一个文本框和评论按钮,再利用 jQuery ajax() 方法来实现网页的评论提交。

6、添加评论框

修改comment_list.html文件,在评论列表上面添加一个文本框和按钮,代码如下:

<div><br><br><textarea rows="5" cols="100" id="cmt_content"></textarea>  <br><button type="button" class="pull-right btn btn-primary" id="cmt_submit">评论</button><br><br><br>
</div>

效果如下:

66491da3e8bc9643f9b6ee3e721f7c51.png

7、实现评论提交

使用ajax方法进行提交,大体思路如下: 点击评论按钮 --> 获取当前用户、文章等信息 --> 打包成json数据提交后台 --> 后台view视图创建comment信息 --> 存入数据库 --> 返回成功提示 --> 刷新界面。

前端JS代码如下:

<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script><script type="text/javascript">
$(function() {$("#cmt_submit").click(function(){var body = $("#cmt_content").val();if (body.length == 0){alert("请输入评论内容....");return;}//从html获取相关字段 html 里面写的data-*, 这里就写 *var article_id = $(this).data('article_id');var csrf = $(this).data('csrf');                 var ajax_url = $(this).data('ajax_url')//设置post Json字段 var post_data={"article_id":article_id,"body":body,};$.ajaxSetup({data:{'csrfmiddlewaretoken': csrf }});$.ajax({url:ajax_url,type:'post',data:post_data,//{#请求成功回调函数#}success:function (data) {alert(data.msg);window.location.reload(); //刷新当前页面.},//{#请求失败回调函数#}error:function (data) {alert("err"+ data.msg);}});});
})
</script><div><br><br><textarea rows="5" cols="100" id="cmt_content"></textarea><br><button type="button" class="pull-right btn btn-primary"id="cmt_submit" data-csrf="{{ csrf_token }}" data-article_id="{{article.id}}" data-ajax_url="{% url 'comment:cmt_add_url' %}">评论</button><br><br><br>
</div>

后台view视图处理代码如下:

from django.shortcuts import render
from django.views.decorators.http import require_POST
from django.contrib.auth.decorators import login_required
from django.http import JsonResponsefrom blog.models import Article
from .models import Comment# Create your views here.@login_required
@require_POST
def cmt_add_view(request):if request.is_ajax():cmt_user = request.user                       #获取评论的用户cmt_articleid = request.POST.get('article_id')     #获取评论的文章cmt_body = request.POST.get('body')                #获取评论的内容article = Article.objects.get(id=cmt_articleid)     #获取评论的文章comment = Comment(owner=cmt_user, body=cmt_body, belong=article)  #创建一个新的commentcomment.save()            #保存数据return JsonResponse({'msg':'评论提交成功!'})return JsonResponse({'msg':'评论提交失败!'})

全局路由和APP局部路由代码如下

#app下urls.pyfrom django.urls import path
from .views import cmt_add_viewapp_name = '[comment]'urlpatterns = [path('add/',cmt_add_view, name='cmt_add_url'),  # 添加评论:
]#全局下urls.py
path('comment/', include('comment.urls', namespace = 'comment')),

逻辑都很简单,还有注释,不用多比比太多。评论提交功能完成!

d64e42f64475b8e79c86ab541775801e.png

399cad460470df77d35d85a1c37efad6.png

为了实现登陆后评论,修改下前端代码就OK。

<div><br><br>
{% if user.is_authenticated %}<textarea rows="5" cols="100" id="cmt_content"></textarea><br><button type="button" class="pull-right btn btn-primary"id="cmt_submit" data-csrf="{{ csrf_token }}" data-article_id="{{article.id}}" data-ajax_url="{% url 'comment:cmt_add_url' %}">评论</button>
{% else %}<div class="text-center">尚未登录,暂时无法评论。请先<a class="text-danger" href="{% url 'account_login' %}?next={{ request.path }}">登录</a> 或<a class="text-danger" href="{% url 'account_signup' %}?next={{ request.path }}">注册</a></div>
{% endif %}<br><br><br>
</div>

23d1e7a356c61dc039ca027296ab3483.png

文章评论完成,这下终于可以喷博主了@_@ ,完结撒花~ 又是半夜12点了,溜了溜了。。

原创文章,转载请注明出处:http://www.jerrycoding.com/article/site_building_11

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_826815.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建站之星php 漏洞,建站之星任意文件上传漏洞

#1 漏洞产生/module/mod_media.phpflash_picker() 和 image_picker() 两个函数image_picker() 函数$typeArr array(image/jpeg,image/pjpeg);$flash_typeArr array(image/jpeg,image/pjpeg);$file_info & ParamHolder::get(localfile, array(), PS_FILES);$file_info[nam…

网站需要显示在线访问人数

Insus.NET开发这样多网站&#xff0c;客户一直没有这个要求。不过&#xff0c;现在有客户有这样的要求了。在线用户访问人数&#xff0c;也就是说&#xff0c;要为网站写一个计数器&#xff0c;计数器的初始值为0&#xff0c;网站一开始运行时(Application_Start)&#xff0c;就…

个人网站制作模板

前言 小伙伴们&#xff0c;大家好&#xff0c;今天和大家分享主题是个人网页设计作品&#xff0c;此作品包含css文件、fonts文件夹、images文件夹、js文件夹和index.html文件&#xff0c;支持PC端和手机端浏览&#xff0c;使用chrome浏览器&#xff0c;浏览效果更佳。 主题 …

清新漂亮简约好看的个人博客网站模板

该从哪里开始呢&#xff1f;好久没来&#xff0c;有点生疏&#xff0c;有点茫然&#xff0c;那就按常规套路来吧&#xff0c;首先对你们的驻足说声3q&#xff0c;本次分享的是一款个人博客设计&#xff0c;主题为《周末s博客》&#xff0c;本来代码算是早就写好&#xff0c;但因…

个人网站模板

/ 01 / 主题 《周末の飞扬》 / 02 / 图摘

我的家乡网站设计

/ 01 / 主题 《我的家乡》 / 02 / 图摘

简单的个人主页网站制作

/ 01 / 主题 《周末のWIN》 / 02 / 图摘

个人博客网站模板

/ 01 / 主题 《周末の博客》 / 02 / 图摘 / 03 /

个人网站首页设计模板

/ 01 / 主题 《致闺蜜》 / 02 / 开场白 闺蜜我们要做一个有深度的姑娘&#xff0c;有脾气的女流氓&#xff0c;有教养的淑女 / 03 / 图摘 / 04 /

个人网站制作源代码

/ 01 / 前话 《周末听雨》包含动态雨滴效果&#xff0c;采用Dreamweaver软件制作&#xff0c;代码结构简单&#xff0c;DIVCSS布局&#xff0c;目录结构为index.html页面、js、css和images文件夹。 / 02 / 图摘 / 03 /

网站设计模板

/ 01 / 前话 个人网站模板《周末の浅深》&#xff0c;html5css3.文字比图片更能打动人&#xff0c;采用DIV倾斜设计&#xff0c;更加能脱颖而出。 / 02 / 图摘 / 03 /

个人博客网站的设计与实现

/ 前话 / 纯手工敲代码&#xff0c;代码结构简单&#xff0c;divcss布局html静态个人博客首页网页设计&#xff0c;dreamwaver和hb都可以编辑&#xff0c;文件结构包含了css、fonts、images、js和html&#xff0c;运用html5技术&#xff0c;包括nav标签、header标签和footer标签…

html网页设计模板网站

/ 主题 / 《周末青葱》 / 有感 / Green Years&#xff0c;青葱岁月&#xff0c;似水流年&#xff0c;时常会念想曾经的时候&#xff0c;再也回不去的过往&#xff0c;平凡的行程中&#xff0c;我们匆匆相遇&#xff0c;又要匆匆告别...... 人生需要给自己一次机会&#xff0c;…

淘宝网和铁道部订票网站采用什么技术架构来实现网站高负载的呢

12306火车票购票系统&#xff0c;逢假日必瘫痪&#xff0c;引发了强烈反响。在国庆前后&#xff0c;搜狐IT“问诊12306”做了系列报道。当时&#xff0c;铁道系统的答复是&#xff0c;购票人数太多&#xff0c;数据量过大。但是&#xff0c;在前不久淘宝双11大促活动中&#xf…

教你用Vue插槽实现一个简单的电影网站导航栏

用插槽实现一个导航栏 每次访问电影网站&#xff0c;都会看到一个导航栏&#xff0c;今天就仿照一个导航栏结构。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible&quo…

通过FTP连接Azure上的网站

下载发布文件 使用记事本&#xff08;或其他文本工具&#xff09;打开 找到ftp连接地址以及用户名、密码 使用ftp工具进行连接 输入相应参数&#xff0c;连接即可

小型网站渗透常规思路之抛砖引玉

为什么80%的码农都做不了架构师&#xff1f;>>> 首先&#xff0c;我们知道 。当我们得到一个目标后&#xff0c;当然目标只是针对小型网站的一个思路&#xff0c;大型网站又是另外一个思路了。 信息收集 首先要做的就是信息收集&#xff0c;正所谓磨刀不误砍柴功…

ASP.net 添加Service Reference,发布网站要注意的问题

1&#xff0c;开启WCF服务端后&#xff0c;如果ASP是远程添加Service Reference要注意IP地址。 在WCF服务端是否有IP地址无法识别&#xff1a; 以下1、localhost在远程时无法识别添加 2、直接赋值“192.168.1.110”则在WCF程序主机更换时需手动改代码 应改为自动识别本机的IP…

ASP.net 网站发布步骤及注意事项

1、用VS2013打开解决方案。 2、选中解决方案&#xff0c;点击鼠标“右键”—>从弹出对话框中&#xff0c;选择“清理解决方案”。 3、待第2步“清理解决方案”结束后&#xff0c;选中“解决方案”—>点击鼠标“右键”—>在弹出对话框中&#xff0c;选择“重新生成解决…

ASP.net 发布建立网站的步骤。及打开网页500.19、500.21解决方法。

1.控制面板-----> 程序和功能----->打开或关闭Windows功能 Internet信息服务下FTP服务器全选&#xff0c;Web管理工具全选&#xff0c;万维网服务如下图&#xff1a; 点击确定。 2.控制面板---->管理工具----->Internet信息服务&#xff08;IIS&#xff09;管理器…