将多个图像附加到 post 的正确方法是什么? [姜戈]
What is the right way to attach multiple images to a post? [Django]
我在一个网络漫画平台上工作,我需要允许用户在一张中上传多张图片post。
理想情况下 - 尽可能简单,这样用户就不必刷新页面来上传每张图片,也不必在添加图片之前创建并保存 post。
如果用户可以删除或重新排序图像,那就太好了。
此外,我需要使其具有可扩展性,这样我以后就不会遇到问题了。
你能给我一些正确的建议吗?
图像是否应该有自己的模型,并用外键连接到 post? (不确定这是否有意义,看起来有点丑)
或者我应该只在 post 模型的某种类型的字段中保留图像 url 列表,然后创建某种 cdn 并将其上传到那里?
非常感谢任何建议。
如果您在谈论规模,那么您需要弄清楚提供图片的最佳做法是什么。
我建议您使用 S3 来提供您的静态文件(这也将包括您的 user-uploaded 文件)。按照 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 中创建一个 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 文档中的那个修改的。
我在一个网络漫画平台上工作,我需要允许用户在一张中上传多张图片post。
理想情况下 - 尽可能简单,这样用户就不必刷新页面来上传每张图片,也不必在添加图片之前创建并保存 post。
如果用户可以删除或重新排序图像,那就太好了。
此外,我需要使其具有可扩展性,这样我以后就不会遇到问题了。
你能给我一些正确的建议吗?
图像是否应该有自己的模型,并用外键连接到 post? (不确定这是否有意义,看起来有点丑)
或者我应该只在 post 模型的某种类型的字段中保留图像 url 列表,然后创建某种 cdn 并将其上传到那里?
非常感谢任何建议。
如果您在谈论规模,那么您需要弄清楚提供图片的最佳做法是什么。
我建议您使用 S3 来提供您的静态文件(这也将包括您的 user-uploaded 文件)。按照 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 中创建一个 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 文档中的那个修改的。