Django使用模板進行動態局部刷新


想學習python,但是找不到方向,最近想突然對web編程感興趣了,所有一直在看,剛剛對着教程做了一點東西。

 

使用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 class BlogContent(models.Model):
2     blog = models.ForeignKey(Blog)
3     auth = models.CharField('昵稱', max_length=40)
4     contents = models.TextField('內容',max_length=2000)
5     time = models.TimeField(auto_now_add=True)
6     date = models.DateField(auto_now_add=True)

客戶端Form表單

{# 下面是評論輸入區域 #}
    <div id="blogComment">
        <form id="user_content">
            <div>昵稱 <input type="text" id="username" value="匿名"><p/></div>
            <textarea id="content_value"></textarea><p/>
            <input type="text" id="blog_id" value="{{ item.id }}" style="display:none;"/>
            <input type="submit" id="content_submit" value="提交評論"/>
        </form>
    </div>

提交評論的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     });

從服務器讀取全部評論信息並進行顯示的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     }

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 %}

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 ""

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM