"RelatedManager"对象不支持下标操作。

6
感谢您的时间。 我正在尝试获取ForeignKey图像模型的第一张图片,并与其他字段一起显示。
我阅读了一些有关相关模型的问题和文档,最好的方法是在我的模型上创建一个函数,在调用它之后仅获取第一张图片。
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>


我正在获取查询集对象,尽管没有图像显示。 https://github.com/lucasrf27/dealership

请注意,图像字段没有 src 属性,而是 url。此外,您的方法有点无意义;您可以在模板中完成整个操作:{{ veiculo.images.all.0.url }} - Daniel Roseman
我已经尝试过了,但是没有显示任何内容。虽然我得到了veiculo的查询集,但是图片没有显示出来。通过url获取的是由get_image_filename()创建的那个吧? - lucasrf27
1个回答

14

应该是:

def first_image(self):
    return self.images<b>.first()</b>

或者您可以使用下标:

def first_image(self):
    return self.images<b>.all()</b>[0]

你无法对 self.images 关系本身进行下标操作,需要使用 .all() 或者 .first()

请注意两者之间有细微差别。如果没有相关的图片,那么 self.images.first() 将返回 None,而 self.images.all()[0] 将会抛出一个错误。


我已经尝试了两种方法,不再出现错误,但是页面上没有图片。我尝试在ListView上调用函数并在我的视图上使用FBV创建对象,仍然可以获取页面但没有图片。我应该在视图中设置这个first_image而不是模型中吗? - lucasrf27
@locasrf27:你的模板有一个错误:你需要使用.first_image.url而不是first_image.src - Willem Van Onsem
是的,我已经更改了它,变成了 对于veiculos中的veiculo {{veiculo.first_image.url}} 我将更新帖子。 - lucasrf27
稍等一下,将整个项目设置在Github上。 - lucasrf27
@locasrf27:因为.first_image是一个Imagens对象,所以您需要使用它的imagem字段(即ImageField)来访问图像的URL。 - Willem Van Onsem
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接