我正在开发一个webcomics平台,我需要允许用户在一个帖子中上传多个图片。
理想情况下 - 尽量保持简单,这样一个人就不必刷新页面来上传每张图片,或者在添加图片之前创建并保存帖子。
如果用户可以删除或重新排序图片,那就太好了。
另外,我需要让它具有可扩展性,以便我以后不会遇到问题。
你能否就如何正确地做到这一点给我建议?
图片是否有自己的型号,并使用外键连接到帖子? (不确定这是否有意义,似乎有点难看)
或者我应该在帖子模型的某些类型的字段中保留一个图片网址列表,然后创建某种cdn并将其上传到那里?
非常感谢任何建议。
答案 0 :(得分:1)
如果您正在谈论规模,那么您需要弄清楚提供图像的最佳做法。
我建议您使用S3来提供静态文件(这也包括用户上传的文件)。按照this tutorial向您展示如何从头开始设置。
现在,深入了解您的架构,您将需要Post
和PostImage
模型:
<强> 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文档中修改的。