Gracias por tu tiempo. Estoy tratando de obtener las primeras imágenes de un modelo de imagen ForeignKey y mostrarlas con los otros campos

He leído algunas preguntas y documentos sobre modelos relacionados y lo mejor que obtuve fue crear una función en mis modelos para llamarla después solo para obtener la primera imagen.

Models.py:

class Veiculos (models.Model):
    YEAR_CHOICES = []
    for r in range(1960, (datetime.now().year+1)):
        YEAR_CHOICES.append((r, r))

    modelo = models.CharField(max_length=100)
    potencia = models.CharField(max_length=40)
    cor = models.CharField(max_length=30)
    preco = models.DecimalField(max_digits=8, decimal_places=2)
    ano = models.IntegerField(('ano'), choices=YEAR_CHOICES, default=datetime.now().year)
    category = models.ManyToManyField('Categorias')
    created_time = models.DateTimeField(auto_now=True)
    updated_time = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return '%s %s' % (self.modelo, self.preco)

    def get_absolute_url(self):
        return reverse('category2')

    def first_image(self):
        return self.images.first()  

def get_image_filename(instance, filename):
    modelo = instance.veicle.modelo
    slug = slugify(modelo)
    return "veiculos_imagens/%s-%s" % (slug, filename)


class Imagens (models.Model):
    veicle = models.ForeignKey(Veiculos, default=None, on_delete=models.CASCADE, related_name='images')
    imagem = models.ImageField(upload_to=get_image_filename)

Views.py:

def amp_category(request):
    queryset = Veiculos.objects.all()
    return render(request, 'amp/category.amp.html', {'veiculos': queryset})

Category.amp.html:

{% extends "amp/base.amp.html" %} {% block tittle %}
<title>ok</title>{% endblock tittle %} {% block content %}

<body>
    <h1>ok2</h1>
    {% for veiculo in veiculos %}
    <h2>{{veiculo.modelo}}</h2>
    <amp-img src="{{ veiculo.first_image.url }}" alt="ok" width="300" height="340"></amp-img>
    {% endfor %}

</body>

{% endblock %}

</html>

Obtengo los objetos de queryset aunque no se muestra ninguna imagen https://github.com/lucasrf27/dealership

5
lucasrf27 21 oct. 2019 a las 10:46

1 respuesta

La mejor respuesta

Debe ser:

def first_image(self):
    return self.images.first()

O puedes subíndice con:

def first_image(self):
    return self.images.all()[0]

No puede subíndice la relación self.images en sí misma, necesita usar un .all() o .first().

Tenga en cuenta que hay una pequeña diferencia entre los dos. Si no hay imágenes relacionadas, entonces self.images.first() devolverá None, mientras que self.images.all()[0] generará un error.

7
Willem Van Onsem 21 oct. 2019 a las 07:48