[Django学习]Django基础(15)_ajax的评论提交

一 功能介绍

  点击“评论”按钮时,不刷新页面,将评论内容直接插入下方的评论列表中。

  

二 实现方式

1. 为评论框表单设置id属性

// 为评论框表单设置id属性comment_form
<form id="comment_form" action="{% url ‘update_comment‘ %}" method="POST" sytle="overflow:hidden">
    {% csrf_token %}
    <label>{{ user.username }},欢迎评论</label>
    {% for field in comment_form %}
        {{ field }}
    {% endfor %}
    // 添加错误提示框,并设置其id属性comment_error
    <span id="comment_error" class="text-danger pull-left"></span>
    <input type="submit" value="评论" class="btn btn-primary pull-right">
</form>

2. 在{% url ‘update_comment‘ %}对应的方法中添加要返回到当前页面的数据

from django.shortcuts import render, redirect
from django.contrib.contenttypes.models import ContentType
from django.urls import reverse
from django.http import JsonResponse
from .models import Comment
from .forms import CommentForm
# Create your views here.

def update_comment(request):
	referer = request.META.get(‘HTTP_REFERER‘,reverse(‘home‘))
	comment_form = CommentForm(request.POST, user=request.user)
	data = {}
	if comment_form.is_valid():
                # 要接收并保存的数据
		comment = Comment()
		comment.user = comment_form.cleaned_data[‘user‘]
		comment.comment_text = comment_form.cleaned_data[‘comment_text‘]
		comment.content_object = comment_form.cleaned_data[‘content_object‘]
		comment.save()

		# 要返回的返回数据
		# status 标记评论是否验证成功
		data[‘status‘] = ‘Success‘
                #评论列表中的单条评论格式如下:
                #angryze (2018-11-27 15:00:37):
                #444
                #因此返回的数据中需要三个要素:
                #username 对应 angryze
		data[‘username‘] = comment.user.username
                #comment_time 对应 (2018-11-27 15:00:37)
		data[‘comment_time‘]=comment.comment_time.strftime(‘%Y-%m-%d %H:%M:%S‘)
                #text 对应 444
		data[‘text‘]=comment.comment_text
	else:
		data[‘status‘] = ‘Error‘
		data[‘message‘] = list(comment_form.errors.values())[0][0]
        // 以Json格式返回数据
	return JsonResponse(data)

3. 在模版页面中添加javascript语句

        <script type="text/javascript">
		$("#comment_form").submit(function(){
			//第一步,判断是否为空
			$("#comment_error").text("");
			if(CKEDITOR.instances["id_comment_text"].document.getBody().getText().trim()==‘‘){
				$("#comment_error").text("评论内容不能为空");
				return false;
			}

			// 第二步,更新数据到textarea
			CKEDITOR.instances[‘id_comment_text‘].updateElement();
			// 第三步,设置ajax属性
			$.ajax({
				// 设置提交的url与<form>中的action相同
				url: "{% url ‘update_comment‘ %}",
				// 设置提交的方法是POST
				type: ‘POST‘,
				// 序列化表单中的值,其中$(this)表示当前函数的对象,此处代表comment_form表单
				data: $(this).serialize(),
				// 是否运用缓存?
				cache: false,
				// 提交成功,调用方法,返回json数据
				success: function(data){
					console.log(data);
					if(data[‘status‘]=="Success"){
						// 插入数据
						var comment_html = ‘<div>‘+ data[‘username‘] + ‘(‘ + data[‘comment_time‘] + ‘):‘ + data[‘text‘] + ‘</div>‘;
						$("#comment_list").prepend(comment_html);
						// 清空评论框的内容
						CKEDITOR.instances[‘id_comment_text‘].setData(‘‘);
					}else{
						// 如果提交提交不成功,在id=comment_error中返回错误信息
						$("#comment_error").text(data[‘message‘]);

					}

				},
				// 提交错误,调用方法
				error: function(xhr){
					console.log(xhr);
				}

			});
		});
        </script>

  



注明:学习资料来自“再敲一行代码的个人空间”以及“杨仕航的博客”

 

原文地址:https://www.cnblogs.com/AngryZe/p/10022574.html

时间: 2024-08-29 10:14:45

[Django学习]Django基础(15)_ajax的评论提交的相关文章

Django学习之 - 基础模板语言

模板语言循环 1:如果模板语言遇到列表,直接进行循环取值即可. 2:如果模板语言遇到字典进行循环有以下3种: - for item in dict.keys 只循环获取字典key - for item in dict.value 只循环获取字典value - for k,v in dict.items 循环获取字典的key,value全部.实例url:fordict # 字典for循环的取值方法 1 userlist = { 2 '1': {'name': 'jack', 'age': 36},

Django学习之 - 基础部分

学习记录参考: 讲师博客:http://www.cnblogs.com/wupeiqi/articles/5433893.html 老男孩博客:http://oldboy.blog.51cto.com/ 运维平台参考:http://oldboy.blog.51cto.com/2561410/1123127 WEB框架简写与解释解释:Web应用框架有助于减轻网页开发时共通性活动的工作负荷,例如许多框架提供数据库访问接口.标准样板以及会话管理等,可提升代码的可再用性. MVC框架 == Model

[Django学习] Django基础(9)_阅读计数

一. 简单计数法 (一) 实施方法 1. 在现有的models模型中添加readed_num字段用于记录阅读数据. class Blog(models.Model): title = models.CharField(max_length=50) blog_type = models.ForeignKey(BlogType, on_delete=models.DO_NOTHING) content = RichTextUploadingField() author = models.Foreig

[Django学习] Django基础(10)_ContentType学习总结

一. 什么是ContentTypes Django ContentTypes是由Django框架提供的一个核心功能.Django ContentTypes是一个记录了项目中所有model元数据的表,表中一条记录对应着一个存在的model. 当使用django-admin初始化一个django项目的时候,可以看到在默认的INSTALL_APPS已经包含了django.contrib.contenttypes: INSTALLED_APPS = [ 'django.contrib.admin', '

django 学习个人总结 之form表单提交

from django.shortcuts import render_to_response from django import forms from django.http import HttpResponse class UserForm(forms.Form):         name = forms.CharField() def register(req):         if req.method == 'POST':                 form_object

Django学习-----Django开发流程

1. 安装django Django的下载地址:https://www.djangoproject.com/download/ 解压缩后进入这个目录,执行python setup.py install 2. 测试 #python #import python 没有出现错误,证明安装成功 3.创建django项目 #django-admin.py startproject  web_01 4. 修改settings.py 修改TIME_ZON为  Asia/Shanghai 修改LANGUAGE_

django学习之旅 - 基础命令讲解

好久没有写博文了,之前总是写python脚本,一直没有写过python web方面的东西,web方面的作品都用php写的,最近在死命的学习django,打算好好写一个python方面的作品,我一直在想,能不能写一个安卓app来做我平时的工作呢,还是不好高骛远了,先把django学好吧,这个是之前写的笔记,因为赶上节日所以用手机看视频资料学习的就没有过多的整理文档,在后续会慢慢的讲文档都加上. OK,这篇文档就简单的讲讲django的基础命令, 以及一个简单的小实例吧. django 基础命令讲解

Django学习系列之基础

Django介绍 Django简介 Django是一个基于MVC构造的框架.但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model).模板(Template)和视图(Views),称为 MTV模式,它们各自的职责如下: 模型(Model),即数据存取层 处理与数据相关的所有事务: 如何存取.如何验证有效性.包含哪些行为以及数据之间的关系等 视图(View),即表现层 处理与表现相关的决定: 如何在页面或其他类型文档中进行显示;模型与模板的桥

Django 学习笔记(七)数据库基本操作(增查改删)

一.前期准备工作,创建数据库以及数据表,详情点击<Django 学习笔记(六)MySQL配置> 1.创建一个项目 2.创建一个应用 3.更改settings.py 4.更改models.py 5.同步数据 二.安装IPython方便debug sudo apt-get install ipython3 安装成功后用python manage.py shell 会自动进入Ipython交互解释器中,没有安装Ipython只有前两行代码,只进入到Python shell 中. Python 3.5