我怎样才能允许用户在django中上传多个图片和文件?

q9yhzks0  于 2023-03-04  发布在  Go
关注(0)|答案(1)|浏览(162)

我想创建一个类似facebook/twitter的功能来创建一个帖子。我有一个类似example.com/username/posts/create的url smth,它的表单与帖子模型相关。正如你可能知道的,在普通的ImageField和FileField中没有上传多个项目的能力,也没有像样的编辑器来拖放类似的东西。拖放不是一个关键的功能,但我真的想处理与twitter/facebook一样的编辑器不知何故。与所有它的方便按钮的照片/视频/文件。
我看到有一堆自定义编辑器像DJANGO-CKEDITOR等,但我不明白它应该如何工作,无论如何与一个图像/文件字段.也许,有人面临的问题?
附上我的表格和模型,以防有帮助:
Models.py

class Post(models.Model):
    title = models.CharField(max_length=200, null=True, blank=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    images = models.ImageField(null=True, blank=True, upload_to="posts/images")
    body = models.TextField(max_length=255)
    post_date = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)
    likes = models.ManyToManyField(User, through='UserPostRel', related_name='likes')

forms.py

class PostCreationForm(ModelForm):
    class Meta:
        model = Post
        fields = [
            'title',
            'body',
            'images',

        ]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['title'].label = "Title"
        self.fields['body'].label = "Body"
        self.fields['images '].label = "images"
wj8zmpe1

wj8zmpe11#

通常这是通过一个额外的模型来完成的:

class Post(models.Model):
    title = models.CharField(max_length=200, null=True, blank=True)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    body = models.TextField(max_length=255)
    post_date = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)
    likes = models.ManyToManyField(
        settings.AUTH_USER_MODEL, through='UserPostRel', related_name='likers'
    )

class PostImage(models.Model):
    post = models.ForeignKey(Post, related_name='images')
    image = models.ImageField(upload_to='posts/images')

然后我们创建一个小表单来处理批量上传:

class PostForm(forms.ModelForm):
    files = forms.FileField(
        label='',
        required=False,
        widget=forms.ClearableFileInput(attrs={'multiple': True}),
    )

    class Meta:
        model = Post
        fields = [
            'title',
            'body',
        ]
        labels = {'title': 'Title', 'body': 'Body'}

    def _save_m2m(self):
        super()._save_m2m()
        images = [
            PostImage(post=self.instance, image=file)
            for file in self.files.get('files')
        ]
        PostImage.objects.bulk_create(images)

然后在视图中,我们让表单处理这个问题:

from django.shortcuts import redirect, render

def my_view(request):
    if request.method == 'POST':
        form = PostForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('name-of-some-view')
    else:
        form = PostForm()
    return render(request, 'name-of-some-template.html', {'form': form})

注意:通常使用**settings.AUTH_USER_MODEL[Django-doc]来引用用户模型比直接使用User*模型[Django-doc]要好。更多信息请参见文档的 * refering the User model 部分。

相关问题