Django Ajax

使用Django提交评论时,如果使用Form提交评论信息,那么提交成功后,最好是能把刚刚输入的评论信息显示出来;

所以提交评论信息后,最好能马上将评论内容显示出来。

当时考虑了3种方法:

1、最开始考虑使用Ajax+json,从服务器读取最新的一条评论信息,当多个用户同时提交评论的时候,这种办法会出现不同步的现象,pass掉;

2、还是使用Ajax+json,客户端传递当前页面的评论数量,服务端将客户端未显示的评论全部返回,在ajax的回调函数中加载这些评论;

3、客户端通过ajax向服务器取评论信息,服务器使用模板将评论内容全部渲染为html文本内容,并将内容返回到客户端,客户端将收到的HTML文本插入DIV中。

在方法1和2中,需要在JS代码中解析JSON数据并根据JSON数据生成HTML内容,使用方法3可以使用模板统一处理;相对于处理JSON数据和渲染模板,方法3会加重服务器负担。

下面是代码:

评论的mudel

1 {# 下面是评论输入区域 #}
2     <div id="blogComment">
3         <form id="user_content">
4             <div>昵称 <input type="text" id="username" value="匿名"><p/></div>
5             <textarea id="content_value"></textarea><p/>
6             <input type="text" id="blog_id" value="{{ item.id }}" style="display:none;"/>
7             <input type="submit" id="content_submit" value="提交评论"/>
8         </form>
9     </div>
View Code

提交评论JS代码:

 1 $(function() {
 2         $("#user_content").submit(function(){
 3             var username = $("#username").val();
 4             var content_value = $("#content_value").val();
 5             var blog_id = $("#blog_id").val()
 6             $(this).ajaxSubmit({
 7                 type:"post",  //提交方式
 8                 dataType:"text", //数据类型
 9                 url:"/content/", //请求url
10                 data: {
11                 'username': username,
12                 'content_value': content_value,
13                 'blog_id':blog_id
14                 },
15                 success:function(data){ //提交成功的回调函数
16                     loadNewContents()
17                     $("#content_value").val("");
18                 }
19             });
20             return false; //不刷新页面
21         });
22     });
View Code

从服务器读取全部评论信息并进行显示的JS代码

 1 //加载最新的评论
 2     function loadNewContents()
 3     {
 4         var lstContent = $("#lstContents");
 5         //lstContent.html("");
 6 
 7         var blog_id = $("#blog_id").val()
 8         $(this).ajaxSubmit({
 9             type: "post",  //提交方式
10             dataType: "text", //数据类型
11             url: "/allcontent/", //请求url
12             data: {
13                 'blog_id': blog_id
14             },
15             success: function (data) { //提交成功的回调函数
16                 if(data.length >0)
17                 {
18                      $("#lstContents").html(data);
19 
20                 }
21             }
22         });
23     }
View Code

Django的模板

1 {% for item in list_contents %}
2     <div class="content">
3         <div class="content_info">#{{  forloop.counter }}楼 {{ item.auth }} 发表于 {{ item.date }} {{ item.time }}<p/></div>
4         <div class="content_value">{{ item.contents }}</div>
5         <div class="content_option"><a href="#">回复</a><a href="#">引用 </a></div>
6     </div>
7 {% endfor %}
View Code

Django的views

 1 @csrf_exempt
 2 def get_blog_all_contents(request):
 3     response = HttpResponse()
 4     response['Content-Type'] = "text/json"
 5     strId = request.POST.get("blog_id", '')
 6     if strId:
 7         try:
 8             blog_id = int(strId)
 9             item = Blog.objects.get(id=blog_id)
10             list_contents = item.blogcontent_set.order_by('date', 'time')
11             return render_to_response("blogContentList.html", locals())
12         except Exception, e:
13             print(e)
14     return ""
View Code

 

posted @ 2014-09-11 17:09  爱在夕阳下  阅读(239)  评论(0编辑  收藏  举报