的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
答案 0 :(得分:1)
clean_file()
而不是self.cleaned_data["file"]
属性,则name
方法应该返回。