基于django的个人博客网站建立(四)

前言

网站效果可点击这里访问


今天主要添加了留言与评论在后台的管理和主页文章的分页显示,文章类别的具体展示以及之前预留链接的补充

主要内容

其实今天的内容和前几天的基本相似,就是个体力活

首先是评论在后台的管理:


  1. @auth
  2. def view_comment(request):
  3. if request.method == 'GET':
  4. all_comment = models.Comment.objects.all().order_by('id').reverse()
  5. return render(request, 'backend/view_comment.html', {'all_comment': all_comment})

  1. {% extends 'backend/base.html' %}
  2. {% block link %}
  3. <!-- Bootstrap Markdown -->
  4. {% endblock %}
  5. {% block content %}
  6. <div class="content-wrapper">
  7. <!-- Content Header (Page header) -->
  8. <section class="content-header">
  9. <h1>
  10. 查看评论
  11. </h1>
  12. <ol class="breadcrumb">
  13. <li class="breadcrumb-item"><a href="#">我的博客后台</a></li>
  14. <li class="breadcrumb-item active">查看评论</li>
  15. </ol>
  16. </section>
  17. <!-- Main content -->
  18. <section class="content">
  19. <div class="row">
  20. <div class="col-lg-12">
  21. <div class="box">
  22. <div class="box-header with-border">
  23. <h3 class="box-title">评论列表</h3>
  24. </div>
  25. <!-- /.box-header -->
  26. <div style="height: auto" class="box-body">
  27. <div class="table-responsive">
  28. <table id="articlelist" class="table table-hover no-wrap dataTable" data-page-size="10" role="grid" aria-describedby="articlelist_info">
  29. <thead>
  30. <tr role="row"><th class="sorting_asc" tabindex="0" aria-controls="articlelist" rowspan="1" colspan="1" aria-sort="ascending" aria-label="No: activate to sort column descending">Id</th>
  31. <th class="sorting" tabindex="0" aria-controls="articlelist" rowspan="1" colspan="1" aria-label="Name: activate to sort column ascending">Username</th>
  32. <th class="sorting" tabindex="0" aria-controls="employeelist" rowspan="1" colspan="1" aria-label="Name: activate to sort column ascending">content</th>
  33. <th class="sorting" tabindex="0" aria-controls="employeelist" rowspan="1" colspan="1" aria-label="Name: activate to sort column ascending">creationTime</th>
  34. <th class="sorting" tabindex="0" aria-controls="employeelist" rowspan="1" colspan="1" aria-label="Name: activate to sort column ascending">Email</th>
  35. <th class="sorting" tabindex="0" aria-controls="employeelist" rowspan="1" colspan="1" aria-label="Name: activate to sort column ascending">Articletitle</th>
  36. <th class="sorting" tabindex="0" aria-controls="articlelist" rowspan="1" colspan="1" aria-label="Action: activate to sort column ascending">Action</th>
  37. </tr>
  38. </thead>
  39. <tbody>
  40. {% for comment in all_comment %}
  41. <tr role="row" class="odd">
  42. <td class="sorting_1">{{ comment.id }}</td>
  43. <td>{{ comment.userName }}</td>
  44. <td>{{ comment.content }}</td>
  45. <td>{{ comment.creationTime }}</td>
  46. <td>{{ comment.email }}</td>
  47. <td>{{ comment.article.title }}</td>
  48. <td>
  49. <form style="margin-top: 3px" action="/backend/delete_comment/" method="post">
  50. {% csrf_token %}
  51. <input name="delete_comment_id" style="display: none" type="text" value="{{ comment.id }}">
  52. <button type="submit" class="btn btn-sm btn-danger-outline" data-toggle="tooltip" data-original-title="删除"><i class="ti-trash" aria-hidden="true"></i></button>
  53. </form>
  54. </td>
  55. </tr>
  56. {% endfor %}
  57. </tbody>
  58. </table>
  59. </div>
  60. </div>
  61. </div>
  62. <!-- /.box -->
  63. </div>
  64. </div>
  65. </section>
  66. <!-- /.content -->
  67. </div>
  68. {% endblock %}
  69. {% block script %}
  70. <script>
  71. $('#view_comment').addClass('active')
  72. </script>
  73. {% endblock %}

删除评论:


  1. @auth
  2. def delete_comment(request):
  3. if request.method == 'POST':
  4. delete_comment_id = request.POST.get('delete_comment_id')
  5. models.Comment.objects.filter(id=delete_comment_id).delete()
  6. return redirect('/backend/view_comment')

然后同样是留言的管理:


  1. @auth
  2. def view_message(request):
  3. if request.method == 'GET':
  4. all_message = models.Message.objects.all().order_by('id').reverse()
  5. return render(request, 'backend/view_message.html', {'all_message': all_message})
  6. @auth
  7. def delete_message(request):
  8. if request.method == 'POST':
  9. delete_message_id = request.POST.get('delete_message_id')
  10. models.Message.objects.filter(id=delete_message_id).delete()
  11. return redirect('/backend/view_message')

接下来讲主页的分页显示

这里主要用了django的Paginator做了分页管理:


  1. def index(request):
  2. if request.method == 'GET':
  3. all_article = models.Article.objects.all().order_by('id').reverse()
  4. paginator = Paginator(all_article,7)
  5. page = request.GET.get('page')
  6. try:
  7. contacts = paginator.page(page)
  8. except PageNotAnInteger:
  9. contacts = paginator.page(1)
  10. except EmptyPage:
  11. contacts = paginator.page(paginator.num_pages)
  12. all_type = models.ArticleType.objects.all()
  13. return render(request, 'show/index.html',{'all_article':contacts,'all_type':all_type})

页面显示也做了修改


  1. {% extends "show/base.html" %}
  2. <!-- ======================== END HEADER AREA HERE ================================= -->
  3. <!-- =================== START MAIN CONTENT AREA HERE ========================-->
  4. {% block main %}
  5. <main class="main-content-area section-padding-bottom">
  6. <div class="container">
  7. <div class="row">
  8. <div class="col-md-12">
  9. <div class="row">
  10. {% for article in all_article %}
  11. <div class="col-md-10 mx-auto nagative-margin" data-aos="fade">
  12. <div class="themeix-single-post">
  13. <div class="left-post-number float-left">
  14. <div class="post-number"><span>{{ article.id }}</span></div>
  15. </div>
  16. <div class="right-blog-details ">
  17. <div class="blog-meta">
  18. <p>{{ article.creationTime }}</p>
  19. {% for type in article.articletotype_set.all %}
  20. <p>{{ type.type.name }}</p>
  21. {% endfor %}
  22. </div>
  23. <div class="blog-title pb-3 pt-1">
  24. <h2 class="heading-2"><a href="/blog-details/?article_id={{ article.id }}">{{ article.title }}</a></h2>
  25. </div>
  26. <div class="blog-thumb mb-0">
  27. <a href="/blog-details/?article_id={{ article.id }}"><img src="/static/assets/images/article/{{ article.id }}.jpg" alt="post" /></a>
  28. </div>
  29. </div>
  30. </div>
  31. </div>
  32. {% endfor %}
  33. </div>
  34. </div>
  35. </div>
  36. <div class="post-pagination text-center" data-aos="fade-up">
  37. <ul>
  38. {% if all_article.has_previous %}
  39. <li><a href="/index?page={{ all_article.previous_page_number }}"><i class="fa fa-angle-double-left" aria-hidden="true"></i></a></li>
  40. {% endif %}
  41. {% if all_article.has_previous %}
  42. <li><a href="/index?page={{ all_article.previous_page_number }}">{{ all_article.previous_page_number }}</a></li>
  43. {% endif %}
  44. <li id="nowpage" style="
  45. font-weight: 600;
  46. background: #1D2EF2;
  47. transition: 0.4s;
  48. color: white!important;
  49. border: 1px solid #1D2EF2;" ><a style="color: white!important;" href="/index?page={{ all_article.number }}">{{ all_article.number }}</a></li>
  50. {% if all_article.has_next %}
  51. <li><a href="/index?page={{ all_article.next_page_number }}">{{ all_article.next_page_number }}</a></li>
  52. {% endif %}
  53. {% if all_article.has_next %}
  54. <li><a href="/index?page={{ all_article.next_page_number }}"><i class="fa fa-angle-double-right" aria-hidden="true"></i></a></li>
  55. {% endif %}
  56. </ul>
  57. </div>
  58. </div>
  59. </main>
  60. <!-- ======================== END MAIN CONTENT AREA HERE ========================-->
  61. <!-- ==================== START FOOTER AREA ===================================== -->
  62. {% endblock %}

显示为:

接下来为文章的所有分类做了一个页面来显示


  1. def category(request):
  2. if request.method == 'GET':
  3. all_type = models.ArticleType.objects.all()
  4. return render(request, 'show/category.html', {'all_type': all_type})

  1. {% extends "show/base.html" %}
  2. <!-- ======================== END HEADER AREA HERE ================================= -->
  3. <!-- =================== START MAIN CONTENT AREA HERE ========================-->
  4. {% block header-text %}
  5. <div class="header-text text-center">
  6. <span>{% now "Y-m-d" %}</span>
  7. <h1 class="heading-1 mb-5 mt-1">Categories</h1>
  8. <div class="themeix-author">
  9. <a href="author.html"><img style="width: 100px;height: 100px" src="/static/assets/images/myavator.png" alt="author" /></a>
  10. <h4 class="heading-4 pt-2 pb-3"><a href="/index">huchengyue</a></h4>
  11. </div>
  12. </div>
  13. {% endblock %}
  14. {% block main %}
  15. <!-- ======================== END HEADER AREA HERE ================================= -->
  16. <!-- =================== START MAIN CONTENT AREA HERE ========================-->
  17. <main class="main-content-area section-padding-bottom clearfix wow fadeIn" data-wow-duration="2s">
  18. <div class="page-wrapper tags-page">
  19. <div class="container">
  20. <div class="row">
  21. <div class="col-md-12">
  22. <div class="row">
  23. <div class="col-md-10 mx-auto nagative-margin pb-0">
  24. {% for type in all_type %}
  25. <div class="row dotted-border mb-60" data-aos="fade-up">
  26. <div class="col-md-6">
  27. <div class="tags-thumb">
  28. <a href="/category/details/?type={{ type.name }}"><img src="https://source.unsplash.com/random/800x450?{{ type.id }}" alt="tag-thumb" /></a>
  29. </div>
  30. </div>
  31. <div class="col-md-6">
  32. <div class="tags-right-text">
  33. <div class="btn-post"><span>{{ type.articletotype_set.all.count }} post</span></div>
  34. <div class="tag-title">
  35. <h2 class="heading-2"><a href="/category/details/?type={{ type.name }}">{{ type.name }}</a></h2>
  36. </div>
  37. <p>该分类为{{ type.name }},具体文章请点击查看</p>
  38. <div class="btn-more"><a href="/category/details/?type={{ type.name }}">View All</a></div>
  39. </div>
  40. </div>
  41. </div>
  42. {% endfor %}
  43. </div>
  44. </div>
  45. </div>
  46. </div>
  47. </div>
  48. </div>
  49. </main>
  50. <!-- ======================== END MAIN CONTENT AREA HERE ========================-->
  51. <!-- ==================== START FOOTER AREA ===================================== -->
  52. {% endblock %}

图中每一个分类的配图是使用的https://source.unsplash.com/random/800x450 网站的随机图片,所以页面加载的有一点慢,但还可以接受

最后就是点击分类进入该分类的文章区域,和主页显示的类似,不多说了。

总结

对于文章的相关的东西到目前为止基本差不多了,大体功能已经实现,一些细节部分以后再完善,明天预计完成一个添加照片分享的功能,可以记录和展示一下自己拍到的或收集到的图片。

基于django的个人博客网站建立(四)的更多相关文章

  1. 基于django的个人博客网站建立(三)

    基于django的个人博客网站建立(三) 前言 网站效果可点击这里访问 今天主要完成的是文章在页面的显示以及评论,留言 具体内容 首先我希望主页面是显示我的所有文章,于是在主页面的视图函数中返回了所有 ...

  2. 基于django的个人博客网站建立(二)

    基于django的个人博客网站建立(二) 前言 网站效果可点击这里访问 今天主要完成后台管理员登录的状态以及关于文章在后台的处理 具体内容 首先接上一次内容,昨天只是完成了一个登录的跳转,其他信息并没 ...

  3. 基于django的个人博客网站建立(一)

    基于django的个人博客网站建立(一) 前言 网站效果可点击这里访问 之前基于hexo和github page搭建过一个博客网页,后来由于换了个系统,感觉弄的有点麻烦也就没有再去管它了,最近偶然从网 ...

  4. 基于django的个人博客网站建立(七)

    基于django的个人博客网站建立(七) 前言 网站效果可点击这里访问 这次在原来的基础上添加或修改一些小功能 具体内容 1.代码高亮 在原来的blog-details.html页面添加下面的代码: ...

  5. 基于django的个人博客网站建立(六)

    基于django的个人博客网站建立(六) 前言 今天主要完成的是项目在腾讯云服务器上ubuntu16.04+django+mysql+uwsig+nginx的部署过程网站效果可点击这里访问 主要内容 ...

  6. 基于django的个人博客网站建立(五)

    基于django的个人博客网站建立(五) 前言 网站效果可点击这里访问 之前鸽了两天,今天继续再写点 主要内容 今天加了个展示照片的功能,就叫他生活记录吧 先建表 class Record(model ...

  7. 基于docker搭建wordpress博客网站平台

    WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用. WordPre ...

  8. 【docker构建】基于docker构建wordpress博客网站平台

    WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用. WordPre ...

  9. 从零搭建基于golang的个人博客网站

    原文链接 : http://www.bugclosed.com/post/14 从零搭建个人博客网站需要包括云服务器(虚拟主机),域名,程序环境,博客程序等方面.本博客 就是通过这几个环节建立起来的, ...

随机推荐

  1. unity3d 柏林噪声 PerlinNoise 规律 算法

    测试 每个小数值取100次 print(0.1); LaTest3(0.1f, 0.1f); print("Max:" + La.Max() + "|Min:" ...

  2. 学Maven,这篇万余字的教程,真的够用了!

    1 Maven 介绍 1.1 为什么使用 Maven 由于 Java 的生态非常丰富,无论你想实现什么功能,都能找到对应的工具类,这些工具类都是以 jar 包的形式出现的,例如 Spring,Spri ...

  3. 通信协议TLV的介绍及在python下的代码实现及仿真

    TLV协议是一种通讯协议,一般将数据封装成TLV的形式,即Tag,Length,Value.协议就是指通信双方对数据传输控制的一种规定,规定了数据格式,同步方式,传送速度,传送步骤的问题作出统一的规定 ...

  4. moment.js 默认使用服务器时间

    在前端使用Date对象获取当前时间的时候,该时间是客户端的时间.但是该时间可以被用户修改,所以我们一般情况下并不想要这个时间.如果每一次获取时间的时候都请求一下服务器,那么将会对服务器造成不必要的压力 ...

  5. 70道阿里百度高频Java面试题(框架+JVM+多线程+算法+数据库)

    基础与框架 1.String类能被继承吗,为什么 2.String,Stringbuffer,StringBuilder的区别? 3.ArrayList和LinkedList有什么区别 4.类的实例化 ...

  6. 【ES6基础】字符串扩展

    4.字符串扩展 (1)for...of循环遍历. let foo = [1,2,3,4,5,6] for(let i of foo){ console.log(i); } 结果: (2)include ...

  7. android 7.0+、8.0+应用中点击拍照崩溃的解决办法

    在开发中,项目里面明明已经添加过拍照或者读取相册的权限,但是在点击拍照或者打开相册的时候应用会崩溃,报一下错误: Caused by: android.os.FileUriExposedExcepti ...

  8. Mysql数据库的主从与主主

    前言: 首先,我们得知道我们为什么要做数据库的主从与主主,而后,再讨论他们的优劣与特点:为什么要做主从呢?因为Mysql数据库没有增量备份的机制,当数据量太大的时候备份是个难以解决的问题.但是mysq ...

  9. 服务器端Mysql常用操作

    原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接:https://app.yinxiang.com/shard/s17/nl/19391737/f7463513-5 ...

  10. Linux命令-grep,sed,awk

    grep (global search regular expression[RE] and print out the line) 正则表达式全局搜索并将行打印出来 在文件中查找包含字符串" ...