Django - 模板中未显示注释

Posted

技术标签:

【中文标题】Django - 模板中未显示注释【英文标题】:Django - Annotation not showing in template 【发布时间】:2019-02-19 23:23:14 【问题描述】:

我正在尝试在我的模板中显示注释。我有两个模型(模型 1 和模型 2),我想显示与模型 1 相关的模型 2 的数量。

这是我的views.py:

def model2_count(request, pk):
    model2count = models.Model1.objects.filter(pk=model1.pk).annotate(title_count=Count(‘model2__title'))
    return render(request, 'model1/_model1.html', ‘m2c’: model2count)

这是模板(model1/_model1.html):

我试过了:

% for object in m2c %</h3>
     object.title 
     object.title_count 
% endfor %

并尝试了这个:

% if m2c.title_count %
     m2c.title_count 
% endif %

我已经为此烦恼了几天,但无法弄清楚。以下内容在很大程度上没有帮助:

Django - Annotating Weighted AVG by Group Django: Annotation not working? Django templates are not showing values of annotations Django annotated value in template

令人沮丧的是,我什至不能说为什么应用这些解决方案没有奏效。

感谢任何输入。

另外,这是我的模型,所有的 BS 都被取出了。

class Publication(models.Model):
    title = models.CharField(max_length=150, unique=False, blank=False)
    contributors_note = models.TextField(max_length=300, blank=False)
    website = models.URLField()
    publisher = models.CharField(max_length=250, unique=False)
    publication_date = models.DateField(default=datetime.date.today)
    slug = models.SlugField(allow_unicode=True, unique=False)

    content_type = models.CharField(max_length=100, unique=False)# In this field user's define the type of content (blog, newspaper article, publication etc)
    research_type = models.CharField(max_length=100, unique=False)# In this field user's define whether the research is based on primary or secondary research
    user = models.ForeignKey(Current_user, related_name="publication")
    created_at = models.DateTimeField(auto_now_add=True)
    last_updated = models.DateTimeField(auto_now=True)
    category = models.ForeignKey(Category, related_name="publication",null=True, blank=False)

    comment = models.TextField()


    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super().save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse(
            "publication:single",
            kwargs=
                "username": self.user.username,
                "pk": self.pk
            
        )

    class Meta:
        ordering = ["-created_at"]


class Assessment(models.Model):
    title = models.CharField(max_length=150, unique=False, blank=False)
    publication = models.ForeignKey('publication.Publication', on_delete=models.CASCADE, related_name='assessment')
    analyst = models.ForeignKey(Current_user, null=True, blank=True, related_name="assessment")
    created_at = models.DateTimeField(auto_now_add=True)
    approved_comment = models.BooleanField(default=False)


    key_finding1 = models.TextField(max_length=300)
    key_finding2 = models.TextField(max_length=300)
    key_finding3 = models.TextField(max_length=300)

    ratings_range = (
    ('1', 'Very Weak'),
    ('2', 'Weak'),
    ('3', 'Moderate'),
    ('4', 'Strong'),
    ('5', 'Very Strong'),
    )

    content_rating_1 = models.CharField(max_length=1, choices=ratings_range)
    content_rating_1_comment = models.TextField(max_length=300)
    content_rating_2 = models.CharField(max_length=1, choices=ratings_range)
    content_rating_2_comment = models.TextField(max_length=300)
    content_rating_3 = models.CharField(max_length=1, choices=ratings_range)
    content_rating_3_comment = models.TextField(max_length=300)
    content_rating_4 = models.CharField(max_length=1, choices=ratings_range)
    content_rating_4_comment = models.TextField(max_length=300)
    content_rating_5 = models.CharField(max_length=1, choices=ratings_range)
    content_rating_5_comment = models.TextField(max_length=300)

    source_rating_1 = models.CharField(max_length=1, choices=ratings_range)
    source_rating_1_comment = models.TextField(max_length=300)
    source_rating_2 = models.CharField(max_length=1, choices=ratings_range)
    source_rating_2_comment = models.TextField(max_length=300)
    source_rating_3 = models.CharField(max_length=1, choices=ratings_range)
    source_rating_3_comment = models.TextField(max_length=300)
    source_rating_4 = models.CharField(max_length=1, choices=ratings_range)
    source_rating_4_comment = models.TextField(max_length=300)
    source_rating_5 = models.CharField(max_length=1, choices=ratings_range)
    source_rating_5_comment = models.TextField(max_length=300)


    def approve(self):
        self.approved_comment = True
        self.save()

    def __str__(self):
        return self.title

    class Meta:
        ordering = ["-created_at"]

【问题讨论】:

正在显示什么object.title 显示了吗? 向我们展示您的模型是如何相关的,我不明白 Count('model2__title') 是聚合。如果model2有一个指向model1的ForeignKey,我只希望Count('model2') 如何调试这样的问题:打开你的 Django shell (django-admin shell) 并实际获取一个model1 对象,然后在你的代码中创建你的model2count 变量并检查结果。 @dirkgroten 我完成了调试过程并且它工作正常 - 我得到了正确的计数。 Model2 通过外键与 model1 相关。关于如何调试它的任何其他提示? 【参考方案1】:

我犯了大错。上面给出的解决方案有效。这是我的最终代码:

views.py

class PublicationDetail(SelectRelatedMixin, generic.DetailView):
model = models.Publication
select_related = ("category", "user")

def get_queryset(self):
    queryset = super().get_queryset()
    return queryset.filter(user__username__iexact=self.kwargs.get("username")).annotate(assessment_count=Count('assessment'))

关注的小伙伴们: - 如果您只是发布原始代码而不是试图变得聪明,那么对于想要帮助您的人来说会更容易(并且对您来说更快)。不要尴尬。如果我刚刚这样做,我会节省我们所有的时间。

【讨论】:

【参考方案2】:

第一次聚合仅使用字段名称完成,即 model2 而不是 model2__title

接下来获取建议使用 .valuesvalues_list 但不是必需的注释列的计数。

https://docs.djangoproject.com/es/2.1/topics/db/aggregation/#cheat-sheet

model1 = Model1.objects.get(pk=model1.pk)
model2count = (
    Model1.objects.annotate(count=Count('model2'))
       .filter(pk=model1.pk)
       .values_list('title', 'count', named=True)
)

template.html

% for object in model2count %
     object.title 
     object.count 
% endfor %

【讨论】:

感谢您的回复。我试了一下,没有任何变化 - 模板中没有显示任何内容。 这必须工作。请向我们展示更多模板。或者在浏览器中查看 HTML 源代码。 我完全明白这必须工作。我不知道为什么不是。特别是考虑到当我使用 django shell 时它工作正常 @dirkgroten 感谢您尝试帮助菜鸟。我想通了——dirkgroten 的“这必须奏效”真的很有帮助。问题(像往常一样)是我 - 我忽略了我最初使用的通用视图。

以上是关于Django - 模板中未显示注释的主要内容,如果未能解决你的问题,请参考以下文章

Django学习系列(三.模板template)

html 在Django模板中注释代码

是否有相当于独立JavaScript文件的django模板注释?

Django(十五)模板详解:模板标签过滤器模板注释模板继承html转义

Thymeleaf常用语法:模板注释

matplotlib 中未发生注释