每月项目数在 CreateView 中有效,但在 TemplateView 中无效

Posted

技术标签:

【中文标题】每月项目数在 CreateView 中有效,但在 TemplateView 中无效【英文标题】:Number of Items per month works in CreateView, but not in TemplateView 【发布时间】:2021-12-01 10:01:19 【问题描述】:

我的目标: 在我的模板中显示每月的项目数,即:2021 年 5 月 - 5 日,2021 年 6 月 - 10 日,2021 年 9 月 - 3 日,2021 年 10 月 - 2 日 em>等

我做了什么。我首先创建了一个测试项目,并且我的 Index 视图继承自 CreateView(表单需要它)。一切正常。 但是,在我的主项目中,我的 IndexView 继承自 django 的 TemplateView,并且使用相同的代码显示如下:Sep 2021 - 1, Sep 2021 - 1, Oct 2021 - 1, Oct 2021 - 1, Oct 2021 - 1...你明白了。因此,出于某种原因,它会将每个项目视为一个单独的日期,而不会尝试聚合它们。

所以差异制造者必须是从 django 中不同视图的继承,但是,在我的主项目中,我不能让我的索引视图从 CreateView 继承。另外,我还是 Django 的新手,非常感谢我能得到的所有帮助。直到现在,我费了很大力气才弄明白。

这是我的工作代码(在测试项目中):

models.py

class Movie(models.Model):
    title = models.CharField('Movie name', max_length=100)
    gross = models.IntegerField('Gross', help_text='Worldwide, in dollars.')
    release_date = models.DateField('Date of release', blank=True, null=True)

    def __str__(self):
        return self.title

views.py(注意 context['per_month'] 行)

class IndexView(CreateView):
    form_class = CreateMovieForm
    template_name = 'home/index.html'
    success_url = '/'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # per_month = queryset of dictionaries: month + number of movies in each month
        context['per_month'] = Movie.objects.annotate(
            month=TruncMonth('release_date')).values('month').annotate(c=Count('id')).values('month', 'c')
        context['movies'] = Movie.objects.all()
        return context

forms.py(不确定这里是否相关,但以防万一)

class CreateMovieForm(forms.ModelForm):
    class Meta:
        model = Movie
        fields = '__all__'

        widgets = 'release_date': DateInput(attrs='value': timezone.now().date)

index.html

% for month in per_month %
    <ul>
        <li>
             month.month|date:"M Y"  -  month.c 
        </li>
    </ul>
% endfor %

输出:

2021 年 8 月 - 2 日 2021 年 9 月 - 1 日 2021 年 10 月 - 3 日

这是我的不工作代码(主项目):

models.py

class Item(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    assigned_to = models.ManyToManyField(User)
    date_posted = models.DateTimeField(auto_now_add=True)
    deadline_date = models.DateField(null=True)

注意:我尝试同时尝试:date_posted 和 deadline_date(如果问题是 DatetimeField,而不是 DateField),但没有帮助。

views.py(相同的上下文['per_month'] 行)

class IndexView(LoginRequiredMixin, TemplateView):
    template_name = 'bugtracker/main.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        # per_month = queryset of dictionaries: month + number of movies in each month
        context['per_month'] = Item.objects.annotate(
            month=TruncMonth('date_posted')).values('month').annotate(c=Count('id')).values('month', 'c')

index.html(同上)

输出:

2021 年 8 月 -1 日 2021 年 8 月 -1 日 2021 年 10 月 - 1 日 2021 年 10 月 - 1 日 2021 年 10 月 - 1 日 2021 年 10 月 - 1 日

【问题讨论】:

【参考方案1】:

你应该添加一个.order_by(…) 来强制分组,所以:

context['per_month'] = Item.objects.values(
    month=TruncMonth('date_posted')
).annotate(c=Count('id')).order_by('month')

【讨论】:

好吧,我会……确实做到了。你先生是救生员。现在这很有意义。非常感谢!

以上是关于每月项目数在 CreateView 中有效,但在 TemplateView 中无效的主要内容,如果未能解决你的问题,请参考以下文章

Django CreateView 不保存对象也不给出错误

使用 [mainBundle pathForResource] 的相同代码行在一个项目中失败,但在另一个项目中有效

使用 swift 4 发出 GET 请求在游乐场中有效,但在项目中无效

如何在 CreateView 中获取创建的对象

VS2008 中的 C++ 项目有效,但在 VS2010 中无效

GET 请求在邮递员中有效,但在 Axios 中失败