【问题标题】:Uploading Profile Image using Django ModelForm使用 Django ModelForm 上传个人资料图片
【发布时间】:2011-11-07 18:56:43
【问题描述】:

我查看了相关问题,但似乎没有一个答案有效。我正在尝试为用户上传个人资料图像并让它替换(覆盖)当前图像。保存图像后,我想将文件名更改为用户 ID。图片将以当前形式上传,但不会替换现有图片(例如,它将保存为 2_1.png)。

class PhotoForm(forms.ModelForm):
    def save(self):
        content_type = self.cleaned_data['photo'].content_type.split('/')[-1]
        filename = '%d.%s' % (self.instance.user.id, content_type)

        instance = super(PhotoForm, self).save(commit=False)
        instance.photo = SimpleUploadedFile(filename, self.cleaned_data['photo'].read(), content_type)
        instance.save()
        return instance

    class Meta:
        model = UserProfile
        fields = ('photo',)

def photo_form(request):
    if request.method == 'POST':
        form = PhotoForm(data=request.POST, file=request.FILES, instance=request.user.get_profile())
        if form.is_valid():
            form.save()
    else:
        form = PhotoForm()
    return render(request, 'photo_form.html', {'form': form})

【问题讨论】:

    标签: django file-upload modelform


    【解决方案1】:
    def photo_form(request):
        if request.method == 'POST':
            form = PhotoForm(data=request.POST, file=request.FILES, instance=request.user.get_profile())
            if form.is_valid():
                handle_uploaded_file(request.FILES['<name of the FileField in models.py>'])
    
    def handle_uploaded_file(f):
        dest = open('/path/to/file', 'wb') # write should overwrite the file
        for chunk in f.chunks():
            dest.write(chunk)
        dest.close()
    

    在这里查看:https://docs.djangoproject.com/en/dev/topics/http/file-uploads/ 如果这不起作用,我想如果表格被接受,您可以使用 os.system 删除文件。这可能不是一个很好的解决方案,但它应该可以工作。

    【讨论】:

    • 谢谢。这是我遇到的答案,但我希望 ModelForm 来处理保存。我最终将 FileSystemStorage 子类化以覆盖现有图像并在 UserProfile 模型下的图像字段中使用新存储。
    猜你喜欢
    • 2018-01-28
    • 1970-01-01
    • 2020-01-10
    • 2014-04-14
    • 2020-01-04
    • 2015-05-22
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    相关资源
    最近更新 更多