无法从Django中的ManyToManyField检索值

时间:2017-02-03 22:21:11

标签: python django

我已经阅读了QuerySet API的文档和一些答案,但我似乎无法弄清楚这一点。我想我不理解这背后的概念。

所以,这是我的models.py:

class Categoria(models.Model):
    TODOS = 'Todos'
    VEICULO = 'Veiculo'
    EQUIPAMENTO = 'Equipamento'
    SERVICO = 'Servico'
    OUTRO = 'Outro'

    CATEOGRY_CHOICES = (
        (TODOS, 'Todos'),
        (VEICULO, 'Veiculo'),
        (EQUIPAMENTO, 'Equipamento'),
        (SERVICO, 'Servico'),
        (OUTRO, 'Outro')
    )

    tipo = models.CharField(max_length=15, choices=CATEOGRY_CHOICES, default=TODOS)

    def __str__(self):
        return self.tipo

class Anuncio(models.Model):
    titulo = models.CharField(max_length=50)
    anuncio = models.TextField(max_length=200)
    preco = models.DecimalField(max_digits=6, decimal_places=2)
    contato = models.CharField(max_length=30)
    publicacao = models.DateTimeField()

    categoria = models.ManyToManyField(Categoria)

    def __str__(self):
        return self.titulo

然后,我将此词典发送到视图:

{ 'anuncios' : Anuncio.objects.all()

这就是我显示值的方式:

{% for item in anuncios %}

        <div class="col-sm-6 col-md-4">
            <div class="thumbnail">
                <h3>{{ item.titulo }}</h3>
                <p>{{ item.anuncio }}</p>
                <address>{{ item.contato }}</address>
                <h6><a href="#">{{ item.categoria.all.values }}</a></h6>
            </div>
        </div>

{% endfor %}

但是我无法从ManyToManyField获得正确的值。如果我使用item.categoria,我会得到lista.Categoria.None(lista是应用的名称)。如果我使用item.categoria.all,我会获得<QuerySet [<Categoria: Servico>]>。 如果我使用item.categoria.all.values,我会获得<QuerySet [{'id': 7, 'tipo': 'Servico'}]>。在这种情况下,我真正想要的只是'Servico'这个词。

此外,如果我尝试过滤某些内容,我会收到TemplateSyntaxError at /消息Could not parse the remainder:

2 个答案:

答案 0 :(得分:1)

这是很多对多的关系。不仅有一个类别,而且有很多类别;所以你不能只访问&#34; Servicio&#34;,因为你可能有多个项目。你需要迭代:

{% for cat in item.categoria.all %}{{ cat.tipo }}{% endfor %}

答案 1 :(得分:0)

当我学习Django时,我遇到了麻烦。

我不知道这是一个错字还是在你的实际代码中,但你错过了结束'}'

你有:

{ 'anuncios' : Anuncio.objects.all()

它应该是:

{ 'anuncios' : Anuncio.objects.all() }

但您应该在示例中包含视图代码。

如果你得到这个..它正在返回对象。

<QuerySet [<Categoria: Servico>]>

你应该做的

item.categoria.tipo

获取要为模板中的每个项目显示的提示的特定值。但它会显示为每个项目的“tipo”选择的每个选项。

如果您只希望模板仅显示带有“Servico”的项目,您必须将上下文字典中的查询搜索更改为更具体的查询,或者在模板中更改类似的内容:

{%if item.categoria.tipo == 'Servico'%}
    #enter template code
{%endif%}