Django-从外键字段访问图像

时间:2019-09-26 11:16:51

标签: django django-models model

我正在尝试创建一个单独的Image模型,以将我的所有图片保存为Articles模型。 我已经用我的Article模型的外键创建了Image Model。

这样做之后,我被困住了,我试图获取要为相关文章渲染的每篇文章的图片,但是我没有取得任何进展。有空余时间来帮助您的人吗?

谢谢!!!

我的观点:

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")

谢谢堆积!!

1 个答案:

答案 0 :(得分:0)

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

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

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