上一篇博客中介紹了Blogs App的部分後端功能的實現,在這篇博客中,將繼續爲你們介紹Blogs App中前端功能的實現。javascript
首先來看發佈博客功能的前端頁面。在blogs/templates/blogs目錄下創建名爲addBlog.html的文件,做爲咱們的發佈博客頁面。addBlog.html內容以下:html
<!-- addBlog.html --> {% extends "blogTemplate.html" %} {% block content %} <div class="content"> <form action="{% url 'blogs:addblog' %}" method="post"> {% csrf_token %} {{ form.as_p }} <input type="submit" value="保存並提交"> <input type="button" id="saveDraft" value="保存到草稿"> <div id="tip" > </div> </form> </div> <script> CKEDITOR.replace('blogcontent',{uiColor:'#9AB8F3'}); </script> <script> $("#saveDraft").click(function(){ var blogContent = ""; try { blogContent = CKEDITOR.instances.id_content.getData(); } catch(ex){} $.post("{% url 'blogs:saveDraft' %}", { title:$("#id_title").val(), category:$("#id_category").val(), content:blogContent, csrfmiddlewaretoken:'{{ csrf_token }}' }, function(data,status) { var mydate = new Date(); $("#tip").html("<p>文章已存爲草稿於"+mydate.toLocaleString()+"</p>"); $("#tip").show(); $("#tip").delay(5000).hide(0); }); }); </script> <script> function saveDraft(){ var blogContent = ""; try { blogContent = CKEDITOR.instances.id_content.getData(); } catch(ex){} $.post("{% url 'blogs:saveDraft' %}", { title:$("#id_title").val(), category:$("#id_category").val(), content:blogContent, csrfmiddlewaretoken:'{{ csrf_token }}' }, function(data,status) { var mydate = new Date(); $("#tip").html("<p>文章已存爲草稿於"+mydate.toLocaleString()+"</p>"); }); } setInterval(saveDraft,60000); </script> </div> {% endblock %}這個頁面在顯示的方面比較簡單,就是將咱們在上一篇博客中創建好的BlogForm表單顯示在頁面上。注意,爲了使用CKeditor,咱們須要使用如下的javascript語句對咱們的文本域進行替換:
<script> CKEDITOR.replace('blogcontent',{uiColor:'#9AB8F3'}); </script>其中,blogcontent是咱們文本域的id,而uiColor意味着咱們能夠爲這個文本框指定顏色。
在該頁面中,另一個功能是將正在編輯的文章存儲爲草稿。因爲保存草稿的操做不容許提交表單後跳轉頁面,所以咱們須要使用jquery ajax的方式提交表單。在這裏,咱們提供了兩種方式將文章保存草稿:一、經過用戶手動點擊保存按鈕來存爲草稿;二、每隔1分鐘自動保存草稿。首先來看經過按鈕來保存的javascript代碼:前端
<script> $("#saveDraft").click(function(){ var blogContent = ""; try { blogContent = CKEDITOR.instances.id_content.getData(); } catch(ex){} $.post("{% url 'blogs:saveDraft' %}", { title:$("#id_title").val(), category:$("#id_category").val(), content:blogContent, csrfmiddlewaretoken:'{{ csrf_token }}' }, function(data,status) { var mydate = new Date(); $("#tip").html("<p>文章已存爲草稿於"+mydate.toLocaleString()+"</p>"); $("#tip").show(); $("#tip").delay(5000).hide(0); }); }); </script>
這段代碼的主體能夠抽象成以下形式:java
<script> $("#saveDraft").click(function(){}); </script>在上面的表單中,能夠看到咱們建立了一個id爲saveDraft的按鈕,所以這裏能夠經過$("#saveDraft")來訪問此按鈕,而且指定當單擊該按鈕時執行這個匿名function。
在這個匿名function中,咱們能夠經過blogContent = CKEDITOR.instances.id_content.getData();來取得當前CKeditor編輯器中的內容,並經過POST的方式將表單內容發送給服務器。在這裏,咱們使用jquery ajax的$.post方法來提交表單。該方法包括三個參數:url,data和callback函數。url即爲表單要提交到的地址,這裏咱們依然可使用Django提供的{% url %}標記做爲url;而data是咱們要提交的數據。與通常的提交表單相比,這裏的數據須要以json的格式發送給服務器;而callback是回調函數,即當表單內容被髮送給服務器後要執行的程序,這裏咱們會顯示存爲草稿的時間,而且顯示5秒後消失。python
定時存儲爲草稿的功能與這段代碼基本徹底同樣,只是把這個匿名函數加了個saveDraft的名稱,而後加上了setInterval(saveDraft,60000);這句,以便每隔60s便調用一次此函數,將文章存爲草稿,以下所示:jquery
在成功發佈博客後,頁面會跳轉到addblogResult.html頁面中,該頁面比較簡單,代碼以下所示:ajax
{% extends "blogTemplate.html" %} {% block content %} <div class="content"> {{ info }} </div> <p><a href="{% url 'index' %}">返回首頁</a></p> {% endblock %}
如今,咱們已經能夠發佈本身的博客了。下面讓咱們看看如何發佈評論。首先仍是先來看後端部分,咱們編寫了saveComment函數用於發佈評論,以下所示:json
# blogs/views.py # ... def saveComment(request): comment_content = request.POST['blogcomment'] blog = Blog.objects.get(pk=request.session['currblogId']) result_info = '' try: auther = Users.objects.get(username=request.session['username']) except KeyError: auther = Users.objects.get(username='anony') try: mycomment = Comment.create(blog,comment_content,auther,datetime.datetime.now()) blog.commentcount = blog.commentcount + 1 blog.save() mycomment.save() result_info = 'Success' except ValidationError as e: result_info = 'Fail' return HttpResponseRedirect(reverse('blogs:content',kwargs={'blogId':request.session['currblogId']})) # ...
而發佈評論的前端部分在上一篇博客中介紹content頁面的部分中已經包括了,這裏再搬運一下:後端
<!-- blogs/templates/blogs/content.html --> {% extends "blogTemplate.html" %} {% block content %} <div class="content"> <h2>{{ blog_title }}</h2> {{ content|safe }} </div> <p><a href="{% url 'index' %}">返回首頁</a></p> {% endblock %} {% block comment %} {% if comment_list %} {% for comment in comment_list %} <ul class="comment"> <li> {% if comment.auther.username == "anony" %} <h4>匿名用戶 {{ comment.createtime|date:"Y-m-d H:i:s" }}</h4> {% else %} <img src="{{ comment.auther.logoimage.url }}" width="64" height="64" /> <h4>{{ comment.auther }} {{ comment.createtime|date:"Y-m-d H:i:s" }}</h4> {% endif %} </li> <li>{{ comment.content|safe }}</li> </ul> <hr/> {% endfor %} {% else %} <ul class="comment"> <p>尚未人發表評論</p> </ul> {% endif %} <span>評論 </span> <form action="{% url 'blogs:saveComment' %}" method="post"> {% csrf_token %} <ul class="comment"> <li><textarea name="blogcomment"></textarea></li> <li><input type="submit" value="提交"></li> </ul> </form> {% endblock %}這段代碼中最下方的表單就是咱們發佈評論所用到的。因爲Comment Model沒有涉及文件的上傳操做,所以咱們沒有采用ModelForm的形式,而是本身在前端組織表單,並將對應的值發送給後端。對於一些不太複雜的Model,採用本身設計的表單可能會更方便。 截止到這篇博客,Users App和Blogs App的核心功能已經完成了,咱們如今實現的功能有:用戶註冊、用戶登陸、退出登陸、查看用戶資料、發佈博客、將博客存爲草稿、發佈評論以及瀏覽博客等。從下篇博客開始,將會繼續開發與Users App和Blogs App相關的管理功能,包括編輯博客、刪除博客、修改用戶信息等功能,但願你們繼續關注~