将多个图像附加到帖子的正确方法是什么? [Django的]

时间:2016-01-25 10:39:18

标签: python django django-models django-forms

我正在开发一个webcomics平台,我需要允许用户在一个帖子中上传多个图片。

  • 理想情况下 - 尽量保持简单,这样一个人就不必刷新页面来上传每张图片,或者在添加图片之前创建并保存帖子。

  • 如果用户可以删除或重新排序图片,那就太好了。

  • 另外,我需要让它具有可扩展性,以便我以后不会遇到问题。

你能否就如何正确地做到这一点给我建议?

图片是否有自己的型号,并使用外键连接到帖子? (不确定这是否有意义,似乎有点难看)

或者我应该在帖子模型的某些类型的字段中保留一个图片网址列表,然后创建某种cdn并将其上传到那里?

非常感谢任何建议。

1 个答案:

答案 0 :(得分:1)

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

我建议您使用S3来提供静态文件(这也包括用户上传的文件)。按照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 中创建一个使用Inline Formset的课程,该课程允许您在创建帖子时上传多个图片,如下所示:

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

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

<强> 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文档中修改的。