【问题标题】:Annotate method in django在 django 中注释方法
【发布时间】:2018-01-20 09:23:50
【问题描述】:

我对注释有一点问题。我想在主 html 文件中显示我的班级类别中的记录。我使用 annotate 方法从 db 获取查询。我在第二类 Firmy 中使用 ForeignKey 来分类类别。现在我不知道如何显示例如在“企业”类别中添加了多少个网站在“Firmy”类中。现在我有类似的东西:“业务(2)(3)(4)”,当我使用按id计数的注释时。这是我的 models.py

from django.db import models
from django.utils import timezone


class Kategorie(models.Model):
    glowna = models.CharField(max_length=150, verbose_name='Kategoria')

    class Meta:
        verbose_name='Kategoria'
        verbose_name_plural='Kategorie'

    def __str__(self):
        return self.glowna


class Witryna(models.Model):
    nazwa = models.CharField(default="", max_length=150, verbose_name = 'Nazwa strony')
    adres_www = models.CharField(max_length=70, verbose_name='Adres www')
    slug = models.SlugField(max_length=250, verbose_name='Przyjazny adres url')
    email = models.CharField(max_length=100, verbose_name='Adres e-mail')
    text = models.TextField(max_length=3000, verbose_name='Opis strony')
    kategoria = models.ForeignKey(Kategorie, verbose_name='Kategoria')
    data_publikacji = models.DateTimeField(blank=True, null=True, verbose_name='Data publikacji')

    class Meta:
        verbose_name='Strona www'
        verbose_name_plural = 'Strony www'

    def publikacja(self):
        self.data_publikacji=timezone.now()
        self.save()

    def __str__(self):
        return self.nazwa

还有一部分来自 views.py

from django.db.models import Count

    wpisy_kat = Kategorie.objects.annotate(cnt_witryna=Count('Witryna'))

那么我必须使用什么样的方法或标签来显示例如:

Business(34)
Industry(21)
Health Care(11)

其中名称 od category 是类别类别中的字段,整数是查询到数据库的结果,例如业务类别中有多少网站?

我的 html 文件是:

{%  for kategoria in kategorie %}
<table>
<tr>
<td>

<li><a href="{% url 'detale_kat' slug_kat=kategoria.slug_kat %}">{{ kategoria.glowna|linebreaksbr }} </a></li>
{% for wpis in wpisy_kat %}
{{ wpis }} ({{ cat.cnt_witryna }})
{% endfor %}
</td>
</tr>
</table>
{%  endfor %}

和主 html 文件:

{% include 'firmy/header.html' %}
<html>
<body>
<p>
<center>
<ul id="menu">
    <li><a href="link1.html">Strona główna</a></li>
    <li><a href="link2.html">Jak dodać stronę</a></li>
    <li><a href="link3.html">Regulamin</a></li>
    <li><a href="link4.html">Kontakt</a></li>
</ul>
</center>
<div class="glowna">
    <div class="lewe_menu">

    <h3><center>Ostatnio dodane</center></h3>

    {%include 'firmy/widok_strony.html'%}
    </div>
    <div class="srodek">

        <h3><center>Kategorie</center></h3>
        <center>{%include 'firmy/widok_kategorii.html'%} </center>
    </div>
    <div class="prawe_menu">

    <h3><center>Reklama</center></h3>
    <center>Tutaj wpisz kod reklamy </center>
    </div>
    {% include 'firmy/footer.html' %}
</div>
</body>

</html>

view.py 文件

from django.shortcuts import render, get_object_or_404
from .models import Witryna, Kategorie
from django.utils import timezone
from django.db.models import Count


def widok_strony(request):
    firmy = Witryna.objects.filter(data_publikacji__lte=timezone.now()).order_by('data_publikacji')
    return render(request, 'firmy/widok_strony.html', {'firmy': firmy})

def widok_kategorii(request):
    kategorie = Kategorie.objects.all()
    wpisy_kat = Witryna.objects.annotate(cnt_kategoria=Count('kategoria'))
    return render(request, 'firmy/widok_kategorii.html', {'kategorie': kategorie, 'wpisy_kat': wpisy_kat,})

def index(request):
    firmy = Witryna.objects.filter(data_publikacji__lte=timezone.now()).order_by('data_publikacji')
    kategorie = Kategorie.objects.order_by('glowna')
    wpisy_kat = Witryna.objects.annotate(cnt_witryna=Count('kategoria'))
    return render(request, 'firmy/index.html', {'kategorie': kategorie, 'wpisy_kat': wpisy_kat, 'firmy': firmy})

def detale_strony(request, slug):
    det_wpisu = get_object_or_404(Witryna, slug=slug)
    firmy = Witryna.objects.filter(data_publikacji__lte=timezone.now()).order_by('data_publikacji')
    return render(request, 'firmy/detale_strony.html', {'det_wpisu': det_wpisu, 'firmy': firmy})

def detale_kat(request, slug_kat):
    det_kategorii = get_object_or_404(Kategorie, slug_kat=slug_kat)
    firmy = Witryna.objects.filter(data_publikacji__lte=timezone.now()).order_by('data_publikacji')
    return render(request, 'firmy/detale_kat.html', {'det_kategorii': det_kategorii, 'firmy': firmy})

【问题讨论】:

  • 请用您正在使用的html模板更新您的问题(您可以删除屏幕截图,在这种情况下没有帮助)
  • html 文件已附加
  • 小心,在{{ wpis }} ({{ cat.cnt_witryna }}) 中:将cat 替换为wpis,然后您将混合两个for 循环,annotate 方法已经为您提供了类别列表,您应该只尝试使用我的检查,然后添加&lt;a&gt;标签和wpis.slug_kat(无需使用表格)
  • 是的,我在 {{wpis.cnt.witryna}} 上进行了更改,结果例如:Aktualności i media (1)(1)(1)。当我进入每个类别的类别时,我不仅有相同的页面,例如:网站类别中的 google.com。
  • 请添加呈现此 html 的视图代码,我不明白为什么它列出网站而不是类别

标签: python django


【解决方案1】:

您的视图需要返回如下内容:

wpisy_kat = Kategorie.objects.annotate(cnt_witryna=Count('witryna'))
return render(request, 'app/template.html', {'wpisy_kat': wpisy_kat})

template.html:

<ul>
{% for cat in wpisy_kat %}

    <li>{{ cat }} ({{ cat.cnt_witryna }})</li>

{% endfor %}
</ul>

编辑:

您可以在注释查询中添加排序或过滤,无需从视图传递2个参数,也无需执行for/loops:

替换视图中的查询:

wpisy_kat = Kategorie.objects.annotate(cnt_witryna=Count('witryna')).order_by('glowna')

然后在 HTML 中:

<ul>
{% for cat in wpisy_kat %}

    <li><a href="{% url 'detale_kat' slug_kat=cat.slug_kat %}">{{ cat }} ({{ cat.cnt_witryna }}) </a></li>

{% endfor %}
</ul>

【讨论】:

  • 它返回了我在数据库中的所有页面,而没有按类别划分。
  • @killerbees Kategorie.objects.annotate(cnt_witryna=Count('witryna')) 这一行应该列出所有类别并添加相关页数(witryna 小写),你在 shell 中检查了吗?
  • 我写了这个帖子,所以我的问题在 cmets 上面
  • @killerbees 好的,我看到了截图,类别是蓝色的?黑色的名字是什么? (您最好更新您的帖子而不是发布这样的答案)
  • 是的,类别中添加的类别是蓝色的。黑色的像:“Bardzo fajna strona internetowa”和其他的,是Witryna类中添加的网站的标题。我想构建一个类似 Web 目录的应用程序,例如:bazastron.com.pl 当您访问该网站时,在该网站上您将看到中心
    与类别和类别中的页面数。
猜你喜欢
  • 2015-12-09
  • 2017-10-18
  • 1970-01-01
  • 2018-07-18
  • 2021-06-05
  • 1970-01-01
  • 2012-09-11
  • 2022-12-07
  • 2013-02-27
相关资源
最近更新 更多