Clean_ <fieldname>()阻止文件使用upload_to

时间:2017-10-13 20:41:22

标签: django

的Django == 1.11.6

我想仅使用允许的扩展程序加载文件。 文件仅通过Django admin加载。

我在get_item_path中放了一个断点(在这里用注释标记)。

clean_file方法以某种方式阻止解释器进入 get_item_path。换句话说,解释器不会在断点处停止。

如果我将clean_file注释掉,断点就会起作用。

好吧,get_item_path会被忽略。顺便说一下,创建了ItemFile对象。但是文件未保存(上传的文件不会出现在MEDIA_ROOT目录中。

你能帮我理解我在这里做错了什么吗?

models.py

def get_item_path(instance, filename):
    item_dir = instance.item.get_item_directory() # Breakpoint
    return '{directory}/{filename}'.format(directory=item_dir,
                                           filename=filename)


class ItemFile(models.Model):

    file = models.FileField(blank=False,
                            max_length=255,
                            upload_to=get_item_path,
                            verbose_name=_("file"))

admin.py

class ItemFileForm(ModelForm):
    model = ItemFile

    def clean_file(self):
        permitted_extensions = list(PermittedFileFormats.objects.values_list("file_ext", flat=True))
        filename = self.cleaned_data['file'].name
        real_ext = filename.split(".")[-1]

        if real_ext not in permitted_extensions:
            raise ValidationError(_("File doesn't have a permitted extention!"))
        else:
            return filename

class ItemFileInline(admin.StackedInline):
    model = ItemFile
    form = ItemFileForm
    extra = 0

1 个答案:

答案 0 :(得分:1)

如果没有错误clean_file()而不是self.cleaned_data["file"]属性,则name方法应该返回。