1、視圖函數
# 不需要登錄裝飾器,匿名用戶也可訪問
def article_detail(request, id, slug): # print(slug,id) article = get_object_or_404(ArticlePost, id=id, slug=slug) # 連接redis r = redis.StrictRedis(host=settings.REDIS_HOST, port=settings.REDIS_PORT, db=settings.REDIS_DB) # 總的訪問次數,訪問一次就+1,一般命名規則為"對象類型:對象ID:對象屬性" total_views = r.incr('article:{}:views'.format(article.id)) # zincrby(name, amount, value)方法:根據amount設定的步長增加有序集合name中的value的分值(類似於權重) # 實現了每訪問一次文章就會將article_ranking中的article.id分值增加1 # article_ranking中存放的是文章的id用來代表文章,每訪問一次該文章就會增加文章的分值 r.zincrby('article_ranking', 1, article.id) # 獲取分值排名前十的對象 article_ranking = r.zrange('article_ranking', 0, -1, desc=True)[:10] # 獲取排名前十文章的id列表,使用的是列表推導式,先進行for循環,再將每次的的值帶入int()方法運算,將結果放在新的列表中 article_ranking_ids = [int(id) for id in article_ranking] print('文章瀏覽量對應的id:%s' % article_ranking_ids) # 查詢出排名在前十的文章對象,並放在list中。注意id__in用法:id在article_ranking_ids列表中 most_viewed = list(ArticlePost.objects.filter(id__in=article_ranking_ids)) print('文章未排序:%s' % most_viewed) # 將獲得的列表按照下表索引進行排序,lamda為匿名函數,先運算后面表達式,冒號前的x相當於參數,代表most_viewed列表中文章對象 # 按照文章的id得到對應的下標,再按照下標進行排序 most_viewed.sort(key=lambda x: article_ranking_ids.index(x.id)) print('文章已經排序:%s' % most_viewed) return render(request, 'article/column/article_detail.html', {'article': article, 'total_views': total_views, 'most_viewed': most_viewed})
2、前端頁面
{% extends 'article/base.html' %}
{% load staticfiles %}
{% block title %}article detail{% endblock %}
{% block content %}
<div class="container">
<div class="col-md-9">
<header>
<h1>{{ article.title }}</h1>
<p>{{ user.username }} {{ total_views }}次閱讀</p>
</header>
<link rel="stylesheet" href="{% static 'editor/css/editormd.preview.css' %}">
<div id="editormd-view">
<textarea id="append-test" style="display: none">
{{ article.body }}
</textarea>
</div>
</div>
<div class="col-md-3">
<p class="text-center">最受歡迎文章</p>
<ol>
{% for article_rank in most_viewed %}
<li>
<a href="{{ article_rank.get_url_path }}">{{ article_rank.title }}</a>
</li>
{% endfor %}
</ol>
</div>
</div>
<script src="{% static 'js/jquery.js' %}"></script>
<script src="{% static 'editor/lib/marked.min.js' %}"></script>
<script src="{% static 'editor/lib/prettify.min.js' %}"></script>
<script src="{% static 'editor/lib/raphael.min.js' %}"></script>
<script src="{% static 'editor/lib/underscore.min.js' %}"></script>
<script src="{% static 'editor/lib/sequence-diagram.min.js' %}"></script>
<script src="{% static 'editor/lib/flowchart.min.js' %}"></script>
<script src="{% static 'editor/lib/jquery.flowchart.min.js' %}"></script>
<script src="{% static 'editor/editormd.js' %}"></script>
<script type="text/javascript">
$(function () {
editormd.markdownToHTML("editormd-view",{
htmlDecode:"style,script,iframe",
emoji:true,
tasklist:true,
flowChart:true,
tex:true,
sequenceDiagram:true,
});
});
</script>
{% endblock %}