前言

添加一个文章栏目功能.
    感谢大神的教程:Django搭建个人博客.

一.文章栏目

1.修改模型

article/models.py:

...class ArticleColumn(models.Model):"""栏目的 Model"""# 栏目标题title = models.CharField(max_length=100, blank=True)# 创建时间created = models.DateTimeField(default=timezone.now)def __str__(self):return self.titleclass ArticlePost(models.Model):...# 文章栏目的 “一对多” 外键column = models.ForeignKey(ArticleColumn,null=True,blank=True,on_delete=models.CASCADE,related_name='article')...

2.添加测试数据

先修改article/admin.py:

...from .models import ArticleColumn# 注册文章栏目
admin.site.register(ArticleColumn)

然后进入:http://127.0.0.1:8000/admin添加栏目数据.

3.重写文章列表

article/list.html:

<!-- extends表明此页面继承自 base.html 文件 -->
{% extends "base.html" %}
{% load staticfiles %}<!-- 写入 base.html 中定义的 title -->
{% block title %}首页
{% endblock title %}<!-- 写入 base.html 中定义的 content -->
{% block content %}<!-- 定义放置文章标题的div容器 -->
<div class="container"><nav aria-label="breadcrumb"><ol class="breadcrumb"><li class="breadcrumb-item"><a href="{% url 'article:article_list' %}?search={{ search }}">最新</a></li><li class="breadcrumb-item"><a href="{% url 'article:article_list' %}?order=total_views&search={{ search }}">最热</a></li></ol></nav><!-- 新增,搜索栏 --><div class="row"><div class="col-auto mr-auto"><form class="form-inline" ><label class="sr-only">content</label><input type="text"class="form-control mb-2 mr-sm-2"name="search"placeholder="搜索文章..."required></form></div></div><!-- 新增,搜索提示语 -->{% if search %}{% if articles %}<h4><span style="color: red">"{{ search }}"</span>的搜索结果如下:</h4><hr>{% else %}<h4>暂无<span style="color: red">"{{ search }}"</span>有关的文章。</h4><hr>{% endif %}{% endif %}<nav aria-label="breadcrumb"><ol class="breadcrumb"><li class="breadcrumb-item"><a href="{% url 'article:article_list' %}">最新</a></li><li class="breadcrumb-item"><a href="{% url 'article:article_list' %}?order=total_views">最热</a></li></ol></nav><div class="row mt-2">{% for article in articles %}<!-- 文章内容 --><div class="col-12"><!-- 栏目 -->{% if article.column %}<button type="button"class="btn btn-sm mb-2{% if article.column.title == 'Django' %}btn-success{% elif article.column.title == 'Java' %}btn-danger{% elif article.column.title == 'HTML' %}btn-warning{% endif %}">{{ article.column }}</button>{% endif %}<!-- 标题 --><h4><b><a href="{% url 'article:article_detail' article.id %}"style="color: black;">{{ article.title }}</a></b></h4><!-- 摘要 --><div><p style="color: gray;">{{ article.body|slice:'100' }}...</p></div><!-- 注脚 --><p><!-- 附加信息 --><span style="color: green;">{{ article.total_views }} 浏览&nbsp;&nbsp;&nbsp;</span><span style="color: blue;">{{ article.created|date:'Y-m-d' }} 发布&nbsp;&nbsp;&nbsp;</span><span style="color: darkred;">{{ article.updated|date:'Y-m-d' }} 更新</span></p><hr></div>{% endfor %}
</div>
</div>
<!-- 页码导航 -->
<div class="pagination row"><div class="m-auto"><span class="step-links"><!-- 如果不是第一页,则显示上翻按钮 -->{% if articles.has_previous %}<a href="?page=1&order={{ order }}&search={{ search }}" class="btn btn-success">&laquo; 首页</a><span>...</span><a href="?page={{ articles.previous_page_number }}&order={{ order }}&search={{ search }}"class="btn btn-secondary">{{ articles.previous_page_number }}</a>{% endif %}<!-- 当前页面 --><span class="current btn btn-danger btn-lg">{{ articles.number }}</span><!-- 如果不是最末页,则显示下翻按钮 -->{% if articles.has_next %}<a href="?page={{ articles.next_page_number }}&order={{ order }}&search={{ search }}"class="btn btn-secondary">{{ articles.next_page_number }}</a><span>...</span><a href="?page={{ articles.paginator.num_pages }}&order={{ order }}&search={{ search }}"class="btn btn-success">尾页 &raquo;</a>{% endif %}</span></div>
</div>
{% endblock content %}

4.修改写文章功能

templates/article/create.html:

{% extends "base.html" %}
{% load staticfiles %}{% block title %}}写文章{% endblock %}{% block content %}<!-- 写文章表单 -->
<div class="container"><div class="row"><div class="col-12"><br><!-- 提交文章的表单 --><form method="post" action="."><!-- Django中需要POST数据的地方都必须有csrf_token -->{% csrf_token %}<!-- 文章标题 --><div class="form-group"><!-- 标签 --><label for="title">文章标题</label><!-- 文本框 --><input type="text" class="form-control" id="title" name="title"></div><!-- 文章栏目 --><div class="form-group"><label for="column">栏目</label><select class="form-control"id="column"name="column"><option value="none">请选择栏目..</option>{% for column in columns %}<option value="{{ column.id }}">{{ column }}</option>{% endfor %}</select></div><!-- 文章正文 --><div class="form-group"><label for="body">文章正文</label><!-- 文本区域 --><textarea type="text" class="form-control" id="body" name="body" rows="12"></textarea></div><!-- 提交按钮 --><button type="submit" class="btn btn-primary">完成</button></form></div></div>
</div>
{% endblock %}

5.修改写文章视图

article/views.py:

def article_create(request):# 判断用户是否提交数据if request.method == "POST":# 将提交的数据赋值到表单实例中article_post_form = ArticlePostForm(data=request.POST)# 判断提交的数据是否满足模型的需求if article_post_form.is_valid():# 保存数据,但暂时不提交到数据库中new_article = article_post_form.save(commit=False)# 指定数据库中,id=1的用户为作者# 如果你进行过删除数据表的操作,可能会找不到id=1的用户# 此时请重新创建用户,并传入此用户idnew_article.author = User.objects.get(id=request.user.id)if request.POST['column'] != 'none':new_article.column = ArticleColumn.objects.get(id=request.POST['column'])# 将新文章保存到数据库中new_article.save()return redirect('article:article_list')else:return HttpResponse('表单内容有误,请重新填写')# 如果用户请求获取数据else:# 创建表单实例article_post_form = ArticlePostForm()columns = ArticleColumn.objects.all()context = {'article_post_form':article_post_form,'columns':columns}return render(request,'article/create.html',context)

6.修改更新模板

article/update.html:

{% extends "base.html" %} {% load staticfiles %}
{% block title %} 更新文章 {% endblock title %}
{% block content %}
<div class="container"><div class="row"><div class="col-12"><br><form method="post" action=".">{% csrf_token %}<div class="form-group"><label for="title">文章标题</label><!-- 在 value 属性中指定文本框的初始值为旧的内容,即 article 对象中的 title 字段 --><input type="text" class="form-control" id="title" name="title" value="{{ article.title }}"></div><!-- 文章栏目 --><div class="form-group"><label for="column">栏目</label><select class="form-control"id="column"name="column"><option value="none">请选择栏目..</option>{% for column in columns %}<option value="{{ column.id }}"{% if column.id == article.column.id %}selected{% endif %}>{{ column }}</option>{% endfor %}</select></div><div class="form-group"><label for="body">文章正文</label><!-- 文本域不需要 value 属性,直接在标签体中嵌入数据即可 --><textarea type="text" class="form-control" id="body" name="body" rows="12">{{ article.body }}</textarea></div><button type="submit" class="btn btn-primary">完成</button></form></div></div>
</div>
{% endblock content %}

7.修改更新视图

article/views.py:

def article_update(request,id):"""更新文章的视图函数通过POST方法提交表单,更新title,body字段GET方法进入初始表单页面id:是文章的id"""# 获取需要修改的具体文章对象article = ArticlePost.objects.get(id=id)if request.user != article.author:return HttpResponse('抱歉,你无权限修改这篇文章')# 判断用户是否为POST提交表单数据if request.method == "POST":article_post_form = ArticlePostForm(data=request.POST)# 判断提交的数据是否满足模型的需求if article_post_form.is_valid():article.title = request.POST.get('title')article.body = request.POST.get('body')if request.POST['column'] != 'none':article.column = ArticleColumn.objects.get(id=request.POST['column'])else:article.column = Nonearticle.save()# 完成后返回到修改后的文章中,需要传入文章的id值return redirect("article:article_detail",id=id)else:return HttpResponse('表单内容有误,请重新填写')# 如果是get请求else:article_post_form = ArticlePostForm()columns = ArticleColumn.objects.all()context = {'article': article,'article_post_form': article_post_form,'columns':columns}# 将响应返回到模板中return render(request, 'article/update.html', context)

写在最后

本文是个人的一些学习笔记,如有侵权,请及时联系我进行删除,谢谢大家.

Django做一个简单的博客系统(13)----增加文章栏目相关推荐

  1. Django做一个简单的博客系统(14)----增加文章标签

    前言 添加一个文章标签功能.     感谢大神的教程:Django搭建个人博客. 一.文章标签 1.准备 首先要安装Django-taggit:: pip install django-taggit ...

  2. Django做一个简单的博客系统(11)----搜索文章

    前言 实现一个简单的搜索文章的功能.     感谢大神的教程:Django搭建个人博客. 一.搜索文章 1.修改视图函数 article/views.py: def article_list(requ ...

  3. Django做一个简单的博客系统(10)----最热文章

    前言 上一篇文章实现了统计文章浏览量的功能,那么随之而来的就是实现最新最热文章的功能.     感谢大神的教程:Django搭建个人博客. 一.最新,最热文章 其实最热文章功能实现原理很简单,就是根据 ...

  4. django初探-创建简单的博客系统(一)

    django第一步 1. django安装 pip install django print(django.get_version()) 查看django版本 2. 创建项目 打开cmd,进入指定目录 ...

  5. [Django快速开发1]搭建一个简单的博客系统(1)

    系列文章目录 Django快速开发0快速搭建环境并得到django项目的hello world 文章目录 系列文章目录 前言 从Django的模型层开始书写 定义文章模型: 使用脚本向sqlite3中 ...

  6. php ci框架后台管理,ci: 羽翼后台管理平台是一个简单的博客系统,后端基于CodeIgniter,前端基于Semantic UI 2.2.10...

    羽翼后台管理平台(博客系统) 羽翼的由来 羽翼的故事是9月20日的晚上,我突然就想到--造翼者小说.我通过自己构思不少的东西.羽毛代表着轻松.纯洁和神圣的:翼代表着升天和梦想,两者在一起的含义:带着一 ...

  7. SpringBoot+Vue快速搭建简单个人博客系统之后端

    我是markerhub作者的一名粉丝,最初在markerhub公众号关注了博主,去B站白嫖了博主的基于SpringBoot+Vue开发的前后端分离博客项目完整教学的视频教程,看一遍跟着老师敲一遍,有的 ...

  8. 用RC522与arduino做一个简单的门禁系统

    用RC522与arduino做一个简单的门禁系统 插本成功要去新学校了,结果发现新学校宿舍没有电梯没有电子门(虽然海景房很香).这对于住惯养老院的我属实难受所所以打算自己也整一个IC卡的门禁系统.然后 ...

  9. 用koa mongodb 做了个简单的博客系统

    最近在研究koa和mongodb,简单做了个博客系统,目前还未开放评论和发帖功能,欢迎大家吐槽~ ?安装 git clone https://github.com/oliyg/alljscc.git ...

最新文章

  1. Android总结之链式调用(方法链)
  2. all resources based on handshake
  3. c语言如何定义比较大的数组_C语言:数据结构-数组的定义、逻辑结构和特点
  4. java核心api_Java核心API需要掌握的程度..你做到了多少??
  5. 1.13 单用户模式;1.14 救援模式;1.15 克隆虚拟机;1.16 Linux机器相互登录
  6. Java Error(四)
  7. C# 程序中使用 SQLite 数据库
  8. 南阳理工acm24素数距离问题
  9. POSTMAN接口测试流程
  10. Hadoop(一) Centos7 下Hdoop 安装及伪分布式集群部署
  11. SpringBoot MySQL #1 报错 Error executing DDL ...
  12. cocos2D转U3D的一些分享
  13. Linux-CentOS上的服务搭建
  14. linux的gromacs模拟分子运动,动力学模拟gromacs(绝对详细).ppt
  15. vue 总结一项目建立及文件夹结构配置
  16. 树莓派4B学习笔记——IO通信篇(UART)
  17. kafka命令行操作,topic相关命令
  18. php 鼠标经过 图片,jq实现酷炫的鼠标经过图片翻滚效果_jquery
  19. form表单的提交!!!
  20. php仿制网站,如何仿制网站(一模一样),制造后台管理系统CMS

热门文章

  1. Linux挂载硬盘到home目录下
  2. 匹克雅思真题机考软件官方版
  3. Dockerfile简介
  4. 修改内核printk函数打印等级
  5. 如何在VR平台上成功塑造您的品牌?
  6. 时代亿信CA认证概述
  7. iOS开发:集成微信 SDK 支付篇
  8. 翻译Deep Learning and the Game of Go(2)第1章:面向深度学习
  9. 用友U8车间管理案例专题二
  10. 华为设备配置通过GRE接入虚拟专用网