0

我已经在我的项目中添加了 photologue,因为它完成了我试图自己实现的 99% 的事情。

现在我需要将上传的图像和画廊中的图像连接到我的帖子。这就是为什么我在 photologue Photo 模型中添加了 ManyToMany 字段

Class ImageModel(models.Model):
     post_images =  models.ManyToManyField(Post, blank=True)

并且将对画廊模型做同样的事情

class Gallery(models.Model):
     post_gallery =  models.ManyToManyField(Post, blank=True)

现在我的想法是能够在我的帖子中添加画廊和/或特定图像。这两个选项都应该可用。

我想要的查询集是获取附加到帖子的所有单个图像,如果附加了画廊,还包括画廊中的所有图像。然后将它们传递并呈现到某种画廊(滑块、旋转木马或其他东西)中的页面。我希望能够通过一个 for 循环将它们放入模板中,所以我认为查询集必须是一个。

我有一个呈现特定页面类型的视图,我不知道是否应该在此函数中包含查询集和上下文,或者为图像创建一个新的。以及如何去做。

def post(request, slug):
    post = get_object_or_404(Post, post_slug=slug)
    context = {
        'post': post,
     }
    return render(request, 'project_name/post.html', context)

我希望我已经解释了我想做的事情。Django 对我来说是新的,查询集仍然有点复杂。

4

2 回答 2

0

您可以使用 union 将与帖子本身和画廊内部相关联的照片分组。诀窍是获得正确的模型,使它们成为相同的对象:

from django.db import models
from photologue.models import Gallery, Photo


class Post(models.Model):
    title = models.CharField(max_length=100)
    published_at = models.DateTimeField(blank=True, null=True)
    text = models.TextField()
    photos = models.ManyToManyField(Photo, related_name='posts')
    galleries = models.ManyToManyField(Gallery, related_name='posts')

    @property
    def all_images(self):
        # Create a number of querysets that have photos from selected galleries
        # ..note:
        #   .only() is used to trim down on the fields fetched from the database.
        #   .prefetch_related() is used to eliminate extra queries during iteration
        qs = []
        for gallery in self.galleries.prefetch_related('photos').only('photos'):  # type: Gallery
            qs.append(gallery.photos.only('image', 'title'))

        return self.photos.only('image', 'title').union(*qs)      

现在您可以在模板中使用它,如下所示:

{% for photo in post.all_images %}
    <img src="{{ photo.image.url }}" alt="{{ photo.title }}" />
{% endfor %}
于 2020-07-13T20:17:14.397 回答
0

您不应该尝试将画廊添加到帖子中的帖子吗?

from photologue.models import Gallery
class Post(models.Model):
    gallery = models.ManyToManyField(Gallery, blank=True )

#Edit ___ @TwinDewey 在这种情况下,您需要在视图中进行查询以在显示帖子详细信息时获取画廊。

galleries = gallery.posts.all() 
gal = [] 
for excercise in excercises: 
    gal.append(Gallery.objects.filter(gallery__name=self.post.title)) 

或者您可以进行查询并将其与 Post 上下文合并使用

from itertools import chain 
list(chain(post_context,Gallery.objects.filter(gallery__name=self.post.title))) 

那是画廊。帖子会有另一个查询。

于 2020-07-13T11:59:33.393 回答