Django模型文件字段清除复选框功能不能使用清洁方法的字段

问题描述 投票:0回答:1

当我使用字段的清除功能时,像(图像)这样的文件字段的清除复选框不起作用

enter image description here

清洁功能:

 def clean_image(self):
    #file = self.cleaned_data['image']
    file = self.cleaned_data['image']
    if file:
        if not os.path.splitext(file.name)[1] in [".jpg", ".png"]:
            raise forms.ValidationError(
                _("Doesn't have proper extension"))
        return file

但是,如果我删除clean函数复选框清除功能正常,使用这两种方法是否有任何冲突

django django-models django-forms django-rest-framework django-views
1个回答
0
投票

我遇到了同样的问题,一直在寻找答案无济于事。

我假设你正在使用ModelForm,但如果没有,这应该仍然有意义。似乎如果clean_<field_name>()函数没有返回任何东西,那么Django将对所讨论的模型上现有的FileField不采取任何措施。

要在文件更改时正确应用clean函数,首先应执行check if file and not isinstance(file, FieldFile)。这意味着如果再次保存表单,则不会重复检查已保存到模型的文件,同时将检查新文件的合规性。

那么clear复选框的问题是,如果选中该框,表单返回给函数的数据就是False,这意味着清除了clean函数中的逻辑并且没有返回任何内容。目前,我对此问题的临时解决方法如下:

from django import forms
from django.db.models.fields.files import FieldFile


def clean_profile_picture(self):
    file = self.cleaned_data["profile_picture"]
    if file and not isinstance(file, FieldFile):
        content_type = file.content_type
        if content_type in ['image/jpeg', 'image/png']:
            # Reject files that don't match whitelisted content types
            raise forms.ValidationError("File type is not allowed (Allowed types: jpeg, png).")
        return file
    elif not file:
        # If 'clear' checkbox is checked, blank the FieldFile
        return False

我希望这不会抓住一些可能的错误情况,但它会有效地清除模型上的FileField。请注意,条件使用FieldFile,而不是FileField - 这是故意的。你可以阅读更多关于它here。您可能还会发现我使用的content_type检查更合适,因为它会捕获奇怪或不正确的文件扩展名的文件。

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.