2017-02-03 5 views
1

ここではQuerySet APIのドキュメントといくつかの回答を読んだことがありますが、これを理解できないようです。私はこれの背後にある概念を理解していないと思う。DjangoのManyToManyFieldから値を取得できません

だから、これは私の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:が表示されます。

答えて

1

多くのと多対多の関係です。 1つのカテゴリだけでなく、多くのカテゴリがあります。複数のアイテムがある可能性があるので、単に「Servicio」にアクセスすることはできません。あなたはを反復処理する必要があります。

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

それがうまくいって、なぜ、感謝しました! –

0

私はジャンゴを学んでいたとき、私はこれで問題があった。..

私はそのタイプミス場合は、あなたの実際のコードでは知らないが、あなたが閉鎖を欠けています「}」

あなたが持っている:

{ '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%} 
+0

と私の上のDaniel Rosemanの例ははるかに良くて清潔です。笑 –

関連する問題