Django博客存档-显示包括帖子的年月列表

Joh*_*son 2 python django

考虑到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)

我想我需要在所有视图上创建另一个上下文字段,以便执行此操作?但是我真的不知道从哪里开始。我知道我显然可以手动创建一个月列表并循环查看是否匹配帖子,但我无法想象这是最有效的方法。

任何人都有一个很明显的解决方案,我可能在这里不见了?

Ram*_*e M 6

这就是我的方法。对于您要实现的目标,可能看起来太复杂了。但这给了很多控制权。

您想要在博客应用程序中添加“ 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}}进行计数