考虑到Django是为新闻网站构建的,我正在尝试做一些我认为相对简单的事情。只是想获取按年/月计数分组的存档列表,位于我的博客的侧边栏上。就像是
2018
-Mar(3)
-Feb (2)
-Jan (6)
Run Code Online (Sandbox Code Playgroud)
我在这里进行了很多搜索,但是似乎已经过去了一段时间,因为有人想要做这样的事情,而其他一切都已经过时了。
我已经能够弄清楚如何创建每月存档的url / view / tempate,并且可以通过转到blog/2018/03 这里是我博客的观点来显示一个月的帖子
class BlogListView(generic.ListView):
model = Post
context_object_name = 'post_list'
queryset = Post.objects.all()
template_name = 'post_list.html'
class ArticleMonthArchiveView(MonthArchiveView):
queryset = Post.objects.all()
date_field = "posted"
allow_future = True
def blog_post(request, slug):
blog_post = Post.objects.get(slug=slug)
context = {'blog_post': blog_post}
return render(request, 'blog/blog_post.html', context)
Run Code Online (Sandbox Code Playgroud)
和我的网址(请暂时忽略网址和路径的混合-可以解决!)
urlpatterns = [
url(r'^$', BlogListView.as_view(), name='blog'),
url(r'^(?P<slug>[\w-]+)/$', blog_post, name='blog_post'),
path('<int:year>/<int:month>/',
ArticleMonthArchiveView.as_view(month_format='%m'),
name="post_archive_month"),
]
Run Code Online (Sandbox Code Playgroud)
我想我需要在所有视图上创建另一个上下文字段,以便执行此操作?但是我真的不知道从哪里开始。我知道我显然可以手动创建一个月列表并循环查看是否匹配帖子,但我无法想象这是最有效的方法。
任何人都有一个很明显的解决方案,我可能在这里不见了?
这就是我的方法。对于您要实现的目标,可能看起来太复杂了。但这给了很多控制权。
您想要在博客应用程序中添加“ context_processor”,以使帖子列表在所有页面上均可用。
项目/博客/context_processors.py
from .models import Post
def posts(request):
return {
'all_posts': Post.objects.order_by('posted'),
}
Run Code Online (Sandbox Code Playgroud)
在TEMPLATES-> OPTIONS-> context_processors中的settings.py上添加它
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
# ...
],
'APP_DIRS': True,
'OPTIONS': {
'debug':True,
'context_processors': [
'django.contrib.auth.context_processors.auth',
# ....
'django.contrib.messages.context_processors.messages',
'project.blog.context_processors.posts', ### ADDED LINE
],
},
},
]
Run Code Online (Sandbox Code Playgroud)
将此添加到基本模板base.html的侧栏中
<div id='site__side'>
...
{% regroup all_posts by posted.year as year_list %}
<ul>
{% for year in year_list %}
<li>{{ year.grouper }}
{% regroup year.list by posted.month as month_list %}
<ul>
{% for month in month_list %}
<li><a href="{% url 'blog:post_archive_month' year.grouper month.grouper %}">{{ month.list.0.posted|date:'b' }} ({{ month.list|length }})</a></li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
...
</div>
Run Code Online (Sandbox Code Playgroud)
{{month.list.0.posted | date:'b'}}在那里以3个字母的文本格式显示月份
编辑:{{month.list | length}}进行计数
| 归档时间: |
|
| 查看次数: |
698 次 |
| 最近记录: |