我是Django的新手,我正在做一个有很多try 和错误的项目.这是一个 case .我想在我的网站上实现这一点:

arc asia

每个条目将有按月份和年份分组的帖子.如果我点击,我会看到该月和那一年的一堆帖子.

我的网站现在只有4个帖子,都是go 年9月发布的.我设法完成的外观如下所示,这显然是错误的,因为2022年9月应该是一个单独的条目.必须有一些方法来完成这个团队,但我似乎无法做到:

group

我想用档案视图来做这件事,因为我try 失败了,我正以这种方式这样做.我想知道两个方面的情况.以下是相关文件:

blog/models.py

class News(models.Model):
    STATUS_CHOICES = (
        ('draft', 'Draft'),
        ('published', 'Published'),
    )
    news_title = models.CharField(max_length=250)
    null=True)
    slug = models.SlugField(max_length=300, unique_for_date='nw_publish')
    news_author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='news_posts')
    news_body = RichTextField()
    image_header = models.ImageField(upload_to='featured_image/%Y/%m/%d/', null=True, blank=True)  # this

    nw_publish = models.DateTimeField(default=timezone.now)
    nw_status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')
    tags = TaggableManager()

    def __unicode__(self):
        return '%name' % {'name': self.news_title}

    class Meta:
        ordering = ('nw_publish',)

    def __str__(self):
        return self.news_title

    def get_absolute_url(self):
        return reverse('news:news_detail', args=[self.slug])
blog/views.py

class NewsListView(TagMixin, ListView):
    model = News
    queryset = News.objects.all()
    context_object_name = 'newss'
    template_name = 'blog/news.html'


class NewsDetailView(TagMixin, DetailView):
    model = News
    date_field = "nw_publish"
    context_object_name = 'news'
    template_name = 'blog/news_detail.html'

    def get_context_data(self, *, object_list=None, **kwargs):
        data = super().get_context_data(**kwargs)
        data['news_details_view'] = News.objects.all()
        data['news_years'] = News.objects.annotate(year=ExtractYear('nw_publish')).values('year').annotate(total_entries=Count('year'))
        return data


class NewsTagView(TagMixin, ListView):
    model = News
    context_object_name = 'newss'
    template_name = 'blog/news.html'

    def get_queryset(self):
        return News.objects.filter(tags__slug=self.kwargs.get('tag_slug'))


class NewsYearArchiveView(YearArchiveView):
    context_object_name = 'news_years'
    date_field = "nw_publish"
    year_format = '%Y'
    make_object_list = True
    allow_future = True
    queryset = News.objects.filter(nw_status='published').order_by('nw_publish', 'news_title')

blog/urls.py

from django.urls import path, re_path

from . import views
from .views import Home, HomeDetail, Contact, ReportListView, ReportDetailView, NewsListView, NewsDetailView, \
    MemberListView, ProjectListView, ProjectDetailView, SearchView, ReportYearArchiveView, PhotoGallery, AboutDetail, \
    VideoGallery, FCListView, ReportTagView, NewsTagView, NewsYearArchiveView
from django.views.generic.base import RedirectView

# , Gallery

app_name = 'blog'
urlpatterns = [
    # post views

    path('', Home.as_view(), name='home'),
    path("search", SearchView.as_view(), name='search'),
    path('home/<slug:slug>/', HomeDetail.as_view(), name='details'),
    path('news/', NewsListView.as_view(), name='news_list'),
    path('news/<slug:slug>/', NewsDetailView.as_view(), name='news_detail'),
    path('news/taggit/tag/<slug:tag_slug>/', NewsTagView.as_view(), name='post_tag'),
    path('news/<int:year>/', NewsYearArchiveView.as_view(), name="news_year_archive"),
    
]

templates/news_details.html

{% extends 'base.html' %}

{% load static %}
{% block container %}
    <div class="stricky-header stricked-menu main-menu">
        <div class="sticky-header__content"></div><!-- /.sticky-header__content -->
    </div><!-- /.stricky-header -->
    <!--News Details Start-->
    ...
   
                        <div class="sidebar__single sidebar__category">
                            <h3 class="sidebar__title">Archives</h3>

                            <ul class="sidebar__category-list list-unstyled">
                                 {% for y in news_years %}
                                <li><a href={{ y.get_absolute_url }}><i class="fas fa-arrow-circle-right"></i>{{ y }}</a></li>
                               {% endfor %}
                            </ul>
                        </div>
                        <div class="sidebar__single sidebar__tags">
                            <h3 class="sidebar__title">Popular Tags</h3>

                            <div class="sidebar__tags-list">
                                {% for tag in tags %}
                                <a href="{% url 'blog:post_tag'  tag.slug %} ">{{ tag.name }}</a>
                               {% endfor %}
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </section>
    <!--News Details End-->
{% endblock %}

我想要做的是:

  1. 将所有相同的月份和年份帖子组合在一起
  2. 使列表可点击
  3. 点击后显示帖子列表(如何获取该列表?)

对不起,我是一个新手,我不知道Django,还在学习,因此我被这个问题困住了.

我想要做的是:

将所有相同的月份和年份帖子组合在一起 使列表可点击 点击后显示帖子列表(如何获取该列表?) 对不起,我是一个新手,我不知道Django,还在学习,因此我被这个问题困住了.

推荐答案

唯一缺少的是.order_by() [Django-doc](是的,我知道这很奇怪),这将迫使GROUP BY声明:

data['news_years'] = (
    News.objects.annotate(year=ExtractYear('nw_publish'))
    .values('year')
    .annotate(total_entries=Count('year'))
    .order_by()
)

至于使用月份,truncate可能比提取要好,因为那时您仍然有一个Date对象:

from django.db.models.functions import TruncMonth

data['news_years'] = (
    News.objects.values(month=TruncMonth('nw_publish'))
    .annotate(total_entries=Count('month'))
    .order_by()
)

点击后显示帖子列表(如何获取该列表?)

您可以使用以下命令创建年和月的路径:

path(
    'posts/<int:year>/<int:month>/', SomeListView.as_view(), name='posts-by-month'
),

然后,在模板中,您可以通过以下方式链接到该模板:

{% for news_year in news_years %}
    <a href="{% url 'posts-by-month' news_year.month.year news_year.month.year %}">{{ news_year.month }} ({{ news_year.total_entries }})</a>
{% endfor %}

SomeListView中,您可以使用以下选项进行筛选:

class SomeListView(ListView):
    model = News

    def get_queryset(self, *args, **kwargs):
        return (
            super()
            .get_queryset(*args, **kwargs)
            .filter(
                nw_publish__year=self.kwargs['year'],
                nw_publish__month=self.kwargs['month'],
            )
        )

Django相关问答推荐

Django中有修改字段值的挂钩吗?

测试DRF中需要授权头

未显示SWAGER上的一些示例架构

如何创建为模型创建信号的Djangodecorator ?

对象Django API中的对象

如何在Django查询集中查询多对多字段内是否存在实例

在 Trunc 的 kind 属性中使用字段

Django REST框架中如何从另一个视图调用API视图?

django - 让用户登录到测试客户端

使用基于类的 UpdateView 在 Django 中更新用户模型

Django 密码以什么格式存储在数据库中?

如何运行克隆的 Django 元素?

将 XML 从 URL 解析为 python 对象

如何在python中遍历httprequest post变量

Django 向用户推送 HTTP 响应

如何创建一个在复选框右侧显示复选框标签的 Django 表单?

使用直通模型了解 Django 中的多对多字段

django - 使用 get_or_create 自动创建用户时设置用户权限

Django中reverse()和reverse_lazy()的区别

在 Python 中生成 API KEY 和 SECRET 的最简单和最安全的方法是什么