将多个图像附加到 post 的正确方法是什么? [姜戈]

What is the right way to attach multiple images to a post? [Django]

我在一个网络漫画平台上工作,我需要允许用户在一张中上传多张图片post。

你能给我一些正确的建议吗?

图像是否应该有自己的模型,并用外键连接到 post? (不确定这是否有意义,看起来有点丑)

或者我应该只在 post 模型的某种类型的字段中保留图像 url 列表,然后创建某种 cdn 并将其上传到那里?

非常感谢任何建议。

如果您在谈论规模,那么您需要弄清楚提供图片的最佳做法是什么。

我建议您使用 S3 来提供您的静态文件(这也将包括您的 user-uploaded 文件)。按照 this tutorial 进行操作,它向您展示了如何从头开始进行设置。

现在,深入研究您的架构,您将需要 PostPostImage 模型:

models.py:

class Post(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=50)
    body = models.TextField()

class PostImage(models.Model):
    image = models.ImageField(
        upload_to='<path_from_s3_tutorial>'
    )
    width_x = models.IntegerField()
    width_y = models.IntegerField()

    # Foreign Key to Post
    post = models.ForeignKey('Post', null=True, blank=True)

然后当您需要在 forms.py 中创建一个 class 时,它使用 Inline Formset 允许您上传多张图片您创建一个 post,如下所示:

>>> from myapp.models import Post, PostImage
>>> from django.forms import inlineformset_factory
>>>
>>> PostImageFormSet = inlineformset_factory(Post, PostImage, fields=('image',))
>>> post = Post.objects.get(id=13)
>>> formset = PostImageFormSet(instance=post)

然后您将在您的视图中验证您的表单集,如下所示:

views.py

def create_post(request, post_id):
    post = Post.objects.get(pk=post_id)
    PostImageInlineFormSet = inlineformset_factory(Post, PostImage, fields=('image',))
    if request.method == "POST":
        formset = PostImageFormSet(request.POST, request.FILES, instance=post)
        if formset.is_valid():
            formset.save()
            return redirect('index')
    else:
        formset = PostImageFormSet(instance=post)
    return render(request, 'manage_books.html', {'formset': formset})

注意:此示例的大部分内容是根据我在上面链接的 Django 文档中的那个修改的。