【问题标题】:Django - Accessing Images from Foreign Key FieldDjango - 从外键字段访问图像
【发布时间】:2020-01-26 15:56:22
【问题描述】:

我正在尝试制作一个单独的 Image 模型来保存我的所有图片以用于 Articles 模型。 我已经使用我的文章模型的外键创建了图像模型。

这样做之后,我被卡住了,我试图让每篇文章的图片为相关文章渲染,但我没有取得任何进展。有人有空来帮忙吗?

谢谢!!!

我的看法:

class ArticlesView(generic.ListView):
    context_object_name = 'latest_article_list'
    template_name = 'news/articles.html'
    paginate_by = 5

    def get_context_data(self, **kwargs):
        context = super(ArticlesView, self).get_context_data(**kwargs)
        context['categories'] = Category.objects.all()
        return context

    def get_queryset(self):
        category_pk = self.request.GET.get('pk', None)
        if category_pk:
            return Article.objects.filter(article_category__pk=category_pk).order_by("-pub_date")
        return Article.objects.order_by("-pub_date")

我的模型:

class Article(models.Model):
    title = models.CharField('title', max_length=200, blank=True)
    slug = AutoSlugField(populate_from='title', default="",
                         always_update=True, unique=True)
    author = models.CharField('Author', max_length=200, default="")
    description = models.TextField('Description', default="")
    is_published = models.BooleanField(default=False)
    article_text = models.TextField('Article text', default="")
    pub_date = models.DateTimeField(default=datetime.now, blank=True)
    article_category = models.ForeignKey(Category, on_delete="models.CASCADE", default="")

    def __str__(self):
        return self.title


class ArticleImages(models.Model):
    article = models.ForeignKey(Article, on_delete="models.CASCADE", related_name="Images")
    image = models.ImageField("Image")

谢谢堆栈!!

【问题讨论】:

  • 您在模板中使用了{{ article.article_image.url }},但您的模型Article 没有任何名为article_image 的字段。当前从图像到文章的related_nameImages + 这是一个OneToMany 关系,因此在您的模板中,您必须遍历图像才能显示它们,因为您可以拥有多个图像。
  • 我的错,我只是改变了模型,我原来的文章字段有6个图像模型,然后我决定做一个图像模型,这就是为什么你看到旧的字段。模板实际上根本不重要,我只是想弄清楚如何从 Image 模型中获取图像并将它们包含在我的模板中。我将删除 html。

标签: django django-models model


【解决方案1】:

您已将 ArticleImage 的 related_name 定义为“图像”,但您尝试通过模板中的 article.article_image 访问该关系。访问文章图片的正确方法是通过article.Images.image

但是,由于您将图像的关系指定为ForeignKey,所以一个ArticleImage 只能有一个Article,而一个Article 可以有多个图像。 (所谓的多对一关系)。您应该将 ArticleImage 中的 ForeignKey 更改为 OneToOneField。 但是,既然 ArticleImage 是与 Article 的 OneToOne 关系,为什么不直接在文章上设置一个image 字段呢?

此外,您不应将related_name 'Images' 大写,如果是一对一字段,请考虑将其更改为单数'image'

【讨论】:

  • 很抱歉,我没有关注..一篇文章图片只能有一篇文章,但一篇文章可以有多个图片......这正是我想要的不?问题是,假设我的文章有 6 张图片。我通过 Image 模型将它们放入,然后我需要 6 张图像在我的模板中的位置上进行渲染。我不确定如何从 1 到 6 获取图像。我知道它们有一个 id,并且它们在数据库中都共享相同的 article_id。我应该通过 id 得到它们吗?那是我迷路的地方。我可以通过 for 循环获取它们,但那不是只获取所有图像并一次渲染它们吗?
  • @Sandi 你有没有就此得出结论?
猜你喜欢
  • 2012-08-23
  • 2017-08-18
  • 2013-06-08
  • 1970-01-01
  • 2012-10-28
  • 2020-08-16
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
相关资源
最近更新 更多