BBS-文章详情页、点赞功能
文章详情页--布局中header和左边区域不变--用到继承
home_site和article_detail只是布局 中心区域 只是右侧不同-----用到继承原理
--------
url
# 文章详情页
re_path('(?P<username>\w)/(?P<article_id>\d+)$',views.article_detail),
解决复用问题:方式1:封装函数
def get_query_data(username):
user_obj = models.UserInfo.objects.filter(username=username).first()
blog = user_obj.blog
cate_list = models.Category.objects.filter(blog=blog).values('pk').annotate(c=Count('article__title')).values_list(
'title', 'c')
tag_list = models.Tag.objects.filter(blog=blog).values('pk').annotate(count=Count('article')).values_list('title',
'count')
date_list = models.Article.objects.filter(user=user_obj).extra(
select={'y_m_date': "date_format(create_time,'%%Y-%%m')"}).values('y_m_date').annotate(
c=Count('nid')).values_list('y_m_date', 'c')
return {"blog": blog, "cate_list": cate_list, "date_list": date_list, "tag_list": tag_list}
解决复用问题:方式2:inclution_tag 自定义tag(样式和数据结合在一起)
自定义标签和过滤器--解决复用问题
在项目文件下新建
my_tags.py
from django import template
register=template.Library()
@register.simple_tag()
def multi_tag(x,y):
return x*y
运行:
自定义标签和过滤器--解决复用问题
my_tags.py:
from django import template
from blog import models
from django.db.models import Avg, Max, Min, Sum, Count
# 自定义标签和过滤器--解决复用问题
register=template.Library()
@register.simple_tag()
def multi_tag(x,y):
return x*y
@register.inclusion_tag('classification.html')
def get_classification_style(username):
user_obj = models.UserInfo.objects.filter(username=username).first()
blog = user_obj.blog
cate_list = models.Category.objects.filter(blog=blog).values('pk').annotate(c=Count('article__title')).values_list(
'title', 'c')
tag_list = models.Tag.objects.filter(blog=blog).values('pk').annotate(count=Count('article')).values_list('title',
'count')
date_list = models.Article.objects.filter(user=user_obj).extra(
select={'y_m_date': "date_format(create_time,'%%Y-%%m')"}).values('y_m_date').annotate(
c=Count('nid')).values_list('y_m_date', 'c')
return {"blog": blog, "cate_list": cate_list, "date_list": date_list, "tag_list": tag_list}
base.html中的col-md-3的内容
<div class="panel panel-warning">
<div class="panel-heading">我的标签</div>
<div class="panel-body">
{% for tag in tag_list %}
<p><a href="/{{ username }}/tag/{{ tag.0 }}">{{ tag.0 }}({{ tag.1 }})</a></p>
{% endfor %} </div>
</div> <div class="panel panel-danger">
<div class="panel-heading">随笔分类</div>
<div class="panel-body">
{% for cate in cate_list %}
<p><a href="/{{ username }}/category/{{ cate.0 }}">{{ cate.0 }}({{ cate.1 }})</a></p>
{% endfor %} </div>
</div>
<div class="panel panel-success">
<div class="panel-heading">随笔归档</div>
<div class="panel-body">
{% for date in date_list %}
<p><a href="/{{ username }}/archive/{{ date.0 }}">{{ date.0 }}({{ date.1 }})</a></p>
{% endfor %} </div>
</div>
---
标签字符串转义
safe 告诉浏览器不要做转义
在后台保存的是html代码
执行后正常显示:
文章点赞
1、样式构建
方式一
{# 在base引入home_site 和 article_datail的样式#}
<link rel="stylesheet" href="/static/blog/css/article_detail.css">
<link rel="stylesheet" href="/static/blog/css/home_site.css">
方式二:采用继承的方式:
-
不需要引入图片
2、点赞事件绑定
$('#div_digg .action').click(function () {
var is_up=$(this).hasClass('diggit');
alert(is_up)
})
3、点赞的保存
url
# 点赞
path('digg/',views.digg),
$('#div_digg .action').click(function () {
var is_up=$(this).hasClass('diggit');
{#alert(is_up)#}
$.ajax({
url:'/digg/',
type:'post',
data:{'csrfmiddlewaretoken':$("[name='csrfmiddlewaretoken']").val(),
'is_up':is_up,'article_id':{{article_obj.pk}} },
success:function (data) {
console.log(data) }
})
views.py
import json
def digg(request):
print(request.POST)
article_id=request.POST.get('article_id')
# is_up=request.POST.get('is_up') # 字符串
is_up=json.loads(request.POST.get('is_up')) # 字符串
user_id=request.user.pk
ard=models.ArticleUpDown.objects.create(user_id=user_id,article_id=article_id,is_up=is_up) return HttpResponse('ok')
点击一下点赞--数据库中存入数据
4、点赞数的数据同步
success:function (data) {
console.log(data);
if (data.state){
if(is_up){ var val=parseInt($('#digg_count').text());
$('#digg_count').text(val+1)
}
else {
var val=parseInt($('#bury_count').text());
$('#bury_count').text(val+1)
} }
else {
if (data.handled){ $('#digg_tips').html('您已经推荐过了')
}
else {
$('#digg_tips').html('您已经反对过了')
}
setTimeout(function () {
$('#digg_tips').html('')
},1000)
}
}
代码优化
$("#div_digg .action").click(function () {
var is_up = $(this).hasClass("diggit"); $obj = $(this).children("span"); $.ajax({
url: "/digg/",
type: "post",
data: {
"csrfmiddlewaretoken": $("[name='csrfmiddlewaretoken']").val(),
"is_up": is_up,
"article_id": "{{ article_obj.pk }}",
},
success: function (data) {
console.log(data); if (data.state) {
var val = parseInt($obj.text());
$obj.text(val + 1);
}
else {
var val = data.handled ? "您已经推荐过!" : "您已经反对过!";
$("#digg_tips").html(val); setTimeout(function () {
$("#digg_tips").html("")
}, 1000) } }
}) })
本节总结:
复用问题:采用构建函数的的方法解决--采用inclution_tag ,显示成功但
点击分类的链接出现问题
样式引用问题,放在
静态文件static的一级目录下引入成功
BBS-文章详情页、点赞功能的更多相关文章
- BBS项目分布搭建三(个人站点时间归档补充,实现侧边栏跳转、无线级分类、实现文章详情页展示功能)
BBS项目分布搭建三(个人站点时间归档补充,) 1. 个人站点时间归档 """ settings.py设置最好更改以下: LANGUAGE_CODE = 'zh-hans ...
- python 全栈开发,Day81(博客系统个人主页,文章详情页)
一.个人主页 随笔分类 需求:查询当前站点每一个分类的名称以及对应的文章数 完成这个需求,就可以展示左侧的分类 它需要利用分组查询,那么必须要会基于双下划线的查询. 基于双下划线的查询,简单来讲,就是 ...
- thinkPHP中的文章详情页实现“上一篇下一篇”功能经验分享
前段时间在公司中接触到了用thinkPHP搭建的项目,其中涉及到了文章详情页上一篇下一篇翻页的功能实现效果. 因为刚接触这套框架和PHP,所以整理一下实现该功能的经验方法. 如果有不到位的地方,欢迎指 ...
- BBS之文章详情页搭建
博客评论相关 博客文章详情页搭建 {% extends 'base.html' %} {% block css %} <style> #div_digg { float: right; m ...
- BBS论坛 文章详情、点赞、评论
六.文章详情.点赞.评论 文章详情页面: def article_detail(request, username, article_id): # user_obj = models.UserInfo ...
- Django:文章详情页面评论功能需要登录后才能使用,登录后自动返回到文章详情页
背景: 文章详情页正在查看文章,想评论一下写的不错,但是需要先登录才能.页面长这个样子: 方案: 1.点击登录链接时,将该页面的URL传递到登录视图中 request.path获取的是当前页面的相对路 ...
- django博客项目8:文章详情页
首页展示的是所有文章的列表,当用户看到感兴趣的文章时,他点击文章的标题或者继续阅读的按钮,应该跳转到文章的详情页面来阅读文章的详细内容.现在让我们来开发博客的详情页面,有了前面的基础,开发流程都是一样 ...
- HelloDjango 第 08 篇:开发博客文章详情页
作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 首页展示的是所有文章的列表,当用户看到感兴趣的文章时,他点击文章的标题或者继续阅读的按 ...
- dedecms5.7的文章详情页页面标题加载指定txt文本的随机关键字
dedecms5.7的文章详情页加载指定txt文本的随机关键字 1 实现代码如下 {dede:name runphp='yes'} $file_path = "../test.txt&quo ...
- 安卓开发——WebView+Recyclerview文章详情页,解决高度问题
安卓开发--WebView+Recyclerview文章详情页,解决高度问题 最近在写一个APP时,需要显示文章详情页,准备使用WebView和RecyclerView实现上面文章,下面评论.出现了W ...
随机推荐
- python:数据类型
一.数据类型 1.数字int型 主要进行计算 bit_length() 当十进制用二进制表示时,最少使用的位数 a = 13 b = a.bit_length() print (b) 2.布尔值boo ...
- 一个源文件可以写出多个class吗?编译后,会不会生成多个class文件?
会.一个.java源文件里面可以有内部类.其他类(有且仅有一个类可以声明为public),所以编译后,可以有多个class文件.
- 模拟实现ATM与购物商城
一.功能介绍(第6条未实现)模拟实现一个ATM + 购物商城程序1额度15000或自定义2实现购物商城,买东西加入购物车,调用信用卡接口结账3可以提现,手续费5%4支持多账户登录5支持账户间转账6记录 ...
- [UE4]使用蓝图关闭对象的碰撞SetActorEnableCollision
在一个人的身上创建多把枪的时候,由于枪与枪之间重贴会产生碰撞冲突,到时角色控制出现不正常(上下左右行走总是往一个方向移动),这些可以关闭枪支的碰撞:
- laravel文件上传报错 stream_socket_sendto():
原因:文件超过限定大小或没指定临时目录 修改php.ini配置 file_uploads = On ; Temporary directory for HTTP uploaded files (wil ...
- Java常用的线程池
Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixe ...
- route
route 添加/删除一条到192.168.3.0/24的路由,网关为192.168.1.254? route add/del -net 192.168.3.0 netmask 255.255. ...
- SAS获取最后一条观测到指定宏
data theLast; set sashelp.class nobs=last point=last; output; stop; run; data _null_; set theLast; c ...
- java 根据日期获取星期
private String getWeek(String date) { String[] arr=date.split("-"); Calendar calendar = Ca ...
- 插件开发-滑条(slide)开发
自己一直很喜欢开发组件,只是OPP学的不是很精,自己在项目中用别人的框架进行项目开发,难免受制于人,也许这就是个人实际项目需求和框架提供的多少有点不符,引导我自己尝试开发一些自己常用的组件,话不多说, ...