【问题标题】:'RelatedManager' object is not subscriptable“RelatedManager”对象不可下标
【发布时间】:2020-02-17 06:47:42
【问题描述】:

感谢您的宝贵时间。 我正在尝试获取外键图像模型的第一张图像并与其他字段一起显示

我已经阅读了一些关于相关模型的问题和文档,我得到的最好的结果是在我的模型上创建一个函数,以便在获取第一张图像之后调用它。

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 }}
  • 我试过了,但什么也没显示。尽管图像没有显示任何内容,但我将查询集设为 veiculo。通过 url 表示由 get_image_filename() 创建的那个,对吗?

标签: python django python-3.x django-models django-templates


【解决方案1】:

应该是:

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

或者你可以使用下标:

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

self.images 关系本身不能下标,需要使用.all().first()

请注意,两者之间存在细微差别。如果没有相关图片,则self.images.first() 将返回None,而self.images.all()[0] 将引发错误。

【讨论】:

  • 我已经尝试了这两种方法并且不再得到错误,尽管得到的页面没有图像。我试图在我的视图上创建一个调用 ListVIew 和 FBV 函数的对象,但仍然可以获取页面但没有图像。我应该在模型之外的视图中设置这个 first_image 吗?
  • @locasrf27:您的模板包含错误:您需要使用.first_image.url,而不是first_image.src
  • 是的,我将其更改为 veiculo 中的 veiculo {{veiculo.first_image.url}} 我要更新帖子
  • 只需将整个项目设置在 github 上
  • @lucasrf27:对不起,应该是{{ veiculo.first_image.imagem.url }}(所以imagem)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 2013-09-22
相关资源
最近更新 更多