上一篇博客中介绍了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相关的管理功能,包括编辑博客、删除博客、修改用户信息等功能,但愿你们继续关注~