上次完成用户模块和模板的继承,此次咱们来完成文章模块部分功能

前戏部分

1.添加应用

2.更改settings配置

3.第三部配置文章模块url

高潮来了

1.在models.py里添加需要的模型类

from django.db import models
from datetime import datetime
from users.models import UserProfile# Create your models here.class Category(models.Model):"""文章类型"""name = models.CharField(max_length=10, verbose_name='文章类型')add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')def __str__(self):return self.nameclass Meta:verbose_name = '类型信息'verbose_name_plural = verbose_nameclass ArticleInfo(models.Model):"""文章信息,与用户一对多关系,与文章类型一对一关系"""title = models.CharField(max_length=20, verbose_name='文章标题')author = models.ForeignKey(UserProfile, verbose_name='文章作者')category = models.ForeignKey(Category, verbose_name='文章类型')desc = models.TextField(verbose_name='文章描述')content = models.TextField(verbose_name='文章正文')is_delete = models.BooleanField(default=False, verbose_name='是否删除')click_num = models.IntegerField(default=0, verbose_name='浏览量')love_num = models.IntegerField(default=0, verbose_name='点赞量')image = models.ImageField(upload_to='article/%y/%m/%d', verbose_name='文章图片', max_length=200)add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')def __str__(self):return self.titleclass Meta:verbose_name = '文章信息'verbose_name_plural = verbose_nameclass TagInfo(models.Model):"""有关文章的标签,与文章多对多关系"""name = models.CharField(max_length=10, verbose_name='标签姓名')article = models.ManyToManyField(ArticleInfo, verbose_name='所属文章')add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')def __str__(self):return self.nameclass Meta:verbose_name = '标签信息'verbose_name_plural = verbose_nameclass CommentInfo(models.Model):comment_content = models.CharField(max_length=200, verbose_name='文章评论')comment_art = models.ForeignKey(ArticleInfo, verbose_name='所属文章')comment_man = models.ForeignKey(UserProfile, verbose_name='评论人')is_delete = models.BooleanField(default=False, verbose_name='是否删除')add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')def __str__(self):return self.comment_contentclass Meta:verbose_name = '评论信息'verbose_name_plural = verbose_name

2.来创建一个超级后台管理

3. 要上传图片,配置媒体文件夹

总路由url添加:

settings添加:

settings应用进程添加最后一行:

上传完图片后django自动添加媒体目录

4 .在articles的admin.py里添加后台要显示的内容

from django.contrib import admin
from .models import ArticleInfo, TagInfo, Category# Register your models here.class ArticleInfoAdmin(admin.ModelAdmin):"""文章内容"""list_display = ['title', 'author', 'category', 'desc', 'content', 'is_delete', 'click_num', 'love_num', 'image','add_time']fields = ['title', 'author', 'category', 'desc', 'content', 'is_delete', 'click_num', 'love_num', 'image','add_time']class TagInfoAdmin(admin.ModelAdmin):"""标签内容"""list_display = ['name', 'add_time']fields = ['name', 'article', 'add_time']filter_horizontal = ['article']class CategoryAdmin(admin.ModelAdmin):"""文章类型内容"""list_display = ['name', 'add_time']fields = ['name', 'add_time']admin.site.register(ArticleInfo, ArticleInfoAdmin)
admin.site.register(Category, CategoryAdmin)
admin.site.register(TagInfo, TagInfoAdmin)

5 . 去超帅的django后台看一看

6  . 主页实现最关键部分

from django.shortcuts import render, redirect
from .models import UserProfile
from django.core.urlresolvers import reverse
from articles.models import ArticleInfo, TagInfo
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage# Create your views here.def index(request):"""主页程序"""# 首先获取所有文章all_articles = ArticleInfo.objects.all()# 文章按照日期归档,按天排序参数就是day, 最新发表的要排在最前面# 所以设置order='DESC' ,默认是时间最小的排在最前面date_time = all_articles.datetimes('add_time', 'day', order='DESC')# 浏览量排行, 倒序排列加 - ,得到的是一个列表,取前六篇文章click_sort = all_articles.order_by('-click_name')[:6]# 站长推荐, 时间排序, 最新的用倒序, 同上pro_arts = all_articles.order_by('-add_time')[:6]# 获得所有标签, 呈现在页面上all_tags = TagInfo.objects.all()# 获得归档文本的时间, 从html页面传回要查看的参数year = request.GET.get('year', '')month = request.GET.get('month', '')day = request.GET.get('day', '')if year and month and day:# 按照日期筛选文章all_articles = all_articles.filter(add_time__year=year, add_time__month=month, add_time__day=day)all_articles_set = set(all_articles)# 从html页面传回tagid的参数,获得点击的标签的id值,通过tagid传参tagid = request.GET.get('tagid', '')# 此处设置目的是当点击日期和标签时,要呈现的就不是所有文章了,# 取标签和日期的交集, 把列表转化为集合再赋值if tagid:# 通过tagid获得tag,然后通过tag多对多关系获得所有文章tag = TagInfo.objects.filter(id=int(tagid))[0]all_articles = tag.article.all()all_articles_set1 = set(all_articles)try:a = list(all_articles_set & all_articles_set1)if a:all_articles = aexcept:pass# 分页器对象, 设置所有文章每页显示三篇pa = Paginator(all_articles, 3)# 从html页面传回要查看的哪一页的参数,默认值为1pagenum = request.GET.get('pagenum', 1)try:pages = pa.page(pagenum)except PageNotAnInteger:# 前一页最尽头就是第一页pages = pa.page(1)except EmptyPage:# 下一页最尽头就是最后一页, num_pages是总的页数pages = pa.page(pa.num_pages)# 所有相关参数传回HTML页面return render(request, 'index.html', {# 'all_articles': all_articles'pages': pages,  # 分页文章'click_sort': click_sort,  # 阅读量排序'pro_arts': pro_arts,  # 推荐排序'all_tags': all_tags,  # 呈现所有标签'tagid': tagid,'date_time': date_time,'year': year,'month': month,'day': day})
7. html页面相关代码

分页

    <ul id="pagination-flickr">{% if pages.has_previous %}<li class="previous-off"><a href="{% url 'index' %}?pagenum={{ pages.previous_page_number }}&tagid={{ tagid }}&year={{ year }}&month={{ month }}&day={{ day }}">«上一页</a></li>{% endif %}<li class="active">{{ pages.number }}/{{ pages.paginator.num_pages }}</li>{% if pages.has_next %}<li class="next"><a href="{% url 'index' %}?pagenum={{ pages.next_page_number }}&tagid={{ tagid }}&year={{ year }}&month={{ month }}&day={{ day }}">下一页 »</a></li>{% endif %}</ul>

文章归档(请求方式传参)

<h3>文章归档</h3><ul>{% for date in date_time %}<li><p><span class="tutime font-size-18"><a href="{% url 'index' %}?year={{ date.year }}&month={{ date.month }}&day={{ date.day }}">{{ date.year }}年{{ date.month }}月{{ date.day }}日文章归档</a></span></p></li>{% endfor %}</ul>

标签云(请求方式传参)

 <h3>标签云</h3><ul>{% for tag in all_tags %}<li><a href="{% url 'index' %}?tagid={{ tag.id }}&pagenum={{ pages.number }}">{{ tag.name }}</a></li>{% endfor %}</ul>

文章评论详情

# 加修饰器, 没有登录用户点击后跳转制定路径
@login_required(login_url='/users/user_login/')
def comment_add(request, art_id):"""文章评论详情"""if request.user:print(request.user)if art_id:content = request.POST.get('comment', '')print(content)com = Comment()com.comment_man_id = request.user.idcom.comment_art_id = int(art_id)com.comment_content = contentcom.save()return redirect(reverse('articles:article_detail', args=[art_id]))

点赞(ajax异步)

def love_add(request, art_id):"""点赞设置"""if request.is_ajax():art = ArticleInfo.objects.filter(id=int(art_id))[0]art.love_name += 1art.save()result = {'a': 'ok'}return JsonResponse(result)
{% block myjs %}<script src="{% static 'js/jquery.min.js' %}"></script><script>$(function () {$('#dian').click(function () {$.get("{% url 'articles:love_add' article.id %}", function(callback){if (callback.a == 'ok') {value = parseInt($('#zan').text());value = value + 1;$('#zan').text(value);setTimeout(function () {window.location.href = '/';},5000)}})})})</script>
{% endblock %}

django项目:实现一个完整的博客功能(2)相关推荐

  1. django项目:实现一个完整的博客功能(1)

    blog开发流程 1.分析博客页面: 1)完成网站的模块划分 2)从模板页面中抽象出父模板,完成模板页面继承 3)分析模块当中的数据模型,确定模型类当中的字段 2.分析博客实现的功能: 1)用户模块的 ...

  2. 分享Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站

    这是个什么的项目? 使用 Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站. 博客线上地址:www.boblog.com Github地址:https: ...

  3. python博客项目评论_Python 爬虫入门——小项目实战(自动私信博客园某篇博客下的评论人,随机发送一条笑话,完整代码在博文最后)...

    之前写的都是针对爬虫过程中遇到问题的解决方案,没怎么涉及到实际案例.这次,就以博客园为主题,写一个自动私信博客下的评论人员(在本篇留下的评论的同学也会被自动私信,如果不想被私信,同时又有问题,请私信我 ...

  4. 【django】二、构建个人博客网站

    文章目录 简单构建 开启本地虚拟环境 初步创建bolg应用 创建管理员 显示字符内容 pip导出包 时区修改 简单构建 功能模块: 博客 :博文,博客分类,博客标签 评论 : 点赞 : 阅读 : 用户 ...

  5. 如何拥有一个完全免费的博客?

    链接:https://www.zhihu.com/question/20688782/answer/66639460 作者:CODING 链接:https://www.zhihu.com/questi ...

  6. 第一个Python程序——博客自动访问脚本

    第一个Python程序--博客自动访问脚本 动机 今天有朋友写信说他认为自己的wordpress博客内显示的访问统计信息不正常,希望我能为他制造一些访问信息,供他对比.朋友提出的请求是在短时间内快速打 ...

  7. 基于python的个人博客_一款基于 Django 的极简主义个人博客系统

    shadow_blog 介绍 shadow_blog 是一款基于 Django 的极简主义个人博客,已应用在苍茫误此生博客 前端基于 Boundless-UI,风格简约.支持响应式布局, 已适配主流的 ...

  8. 使用github+Hexo人人都能拥有一个美美的博客

    我相信很多人都想拥有一个自己的博客,把自己的一些生活感想或者学习总结写到这上面分享给大家.首先我推荐一个网站简书,无论你是否是搞技术开发工作的或者其他文艺工作者,只要你想写文章,简书无疑是一个好的写文 ...

  9. 开源项目:张帅个人博客

    开源项目:张帅个人博客 [实战]如何通过html+css+mysql+php来快速的制作动态网页(以制作一个博客网站为列) 为完成学校的期末课程设计,花了将近两个月闲暇之余,制作了一个简单的博客网站. ...

最新文章

  1. $(function(){})和$(document).ready(function(){})
  2. STL - 底层实现
  3. 最高效的进(线)程间通信机制--eventfd
  4. 由friend用法引出的声明与定义那些事儿
  5. 红旗linux的安装命令,红旗linux安装【处理思路】
  6. Linux三剑客grep、sed、awk
  7. Android 通过URL scheme 实现点击浏览器中的URL链接,启动特定的App,并调转页面传递参数...
  8. 开奖啦!支付宝全民撒钱 你分到多少?
  9. 【吴恩达机器学习】学习笔记——1.5无监督学习
  10. (三)重构ResNet50以诊断COVID-19
  11. 巨详细 - Win8 + Hyper-V 虚拟机性能简测与虚拟化技术科普(一)
  12. farcry5服务器不稳定,孤岛惊魂5玩起来很卡怎么办 远哭5游戏卡顿解决办法
  13. python恢复图像超分辨率_SRCNN实现图像超分辨率重建
  14. 【Algorithm】算法设计与分析(第二版)- 王红梅 - JAVA实现:3.2 分式化简。设计算法,将一个给定的真分数化简为最简分数形式。例如,将6/8化简为3/4
  15. 计算机地质制图CAD,计算机辅助地质制图
  16. win7升级win10时报0x80072F8F - 0x20000错误处理
  17. Fabric2.3分布式部署(fabric-ca)
  18. PHP 核心技术与最佳实践
  19. html页面设置账号密码,html登录界面设置账号密码
  20. 如何用电脑画平面坐标图_在Word中如何画坐标图?

热门文章

  1. Knife4j文件上传不显示上传选择文本域
  2. php有strock吗,HTML中stroke是什么意思?
  3. 柯美smb扫描出现服务器连接错误_柯尼卡美能达bizhub283服务器连接错误的解决办法.pdf...
  4. 手把手教你,嘴对嘴传达------Tomcat部署和优化以及虚拟主机配置
  5. 【今日CV 计算机视觉论文速览】Fri, 22 Mar 2019
  6. 论媒体融合之技术融合
  7. centOS 8 安装teamview
  8. catia 快速确定指南针方向窗口打开
  9. 本人开发Android视频编码和直播推流使用到的相关命令
  10. [从零开始学习FPGA编程-30]:进阶篇 - 基本时序电路-锁存器(Verilog语言)