【问题标题】:Django Blog Archive-- Display List of Years and Months that Include PostDjango 博客存档——显示包含帖子的年月列表
【发布时间】:2018-03-23 00:39:57
【问题描述】:

考虑到 Django 是为新闻网站构建的,我正在尝试做一些我认为相对简单的事情。只想在我的博客的侧边栏上获得按年/月计数分组的存档列表。类似的东西

2018
 -Mar(3)
 -Feb (2)
 -Jan (6)

我在这里做了很多搜索,但似乎已经有一段时间没有人想要做这样的事情了,而其他一切都已经过时了。

我已经能够弄清楚如何创建每月存档 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)

还有我的 url(请暂时忽略 url 和路径的混合——正在处理这个问题!)

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"),
]

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

有人有我可能在这里遗漏的相当明显的解决方案吗?

【问题讨论】:

    标签: python django


    【解决方案1】:

    这就是我的做法。对于您要实现的目标,它可能看起来过于复杂。但这提供了很多控制权。

    您想在您的博客应用中添加一个“context_processor”,以使帖子列表在所有页面上都可用。

    项目/博客/context_processors.py

    from .models import Post
    
    def posts(request):
        return {
            'all_posts': Post.objects.order_by('posted'),
        }
    

    在 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
                ],
            },
        },
    ]
    

    将此添加到基本模板的侧边栏中 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>
    

    {{ month.list.0.posted|date:'b' }} 以 3 个字母的文本格式显示月份

    编辑:{{ month.list|length }} 计数

    【讨论】:

    • 这太棒了..谢谢。我只有一个问题是计数没有出现..任何想法为什么会发生?
    • 对不起,我犯了一个错误。使用 {{ month.list|length }} 而不是 {{ month.list.count }}
    • @JohnRogerson,在完成这项工作时,我不想让你不知所措。一旦您的博客有 1000 条帖子,计算每个月每个页面加载的计数会真正减慢速度。您可以制作一个模型 MonthPostCount 来存储保存帖子时的计数值。这会快得多。如果您需要帮助,请告诉我
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    相关资源
    最近更新 更多