在Django管理后台获取上传文件的URL
我有一个应用程序,通过Django的管理界面上传文件。我需要返回这个文件的链接,以便其他功能可以使用。这个过程基本上是正常的,但有一个问题:我只能获取到原始文件的名字,而不能得到应用程序保存后的文件名。举个例子,如果我要上传的文件叫做somefile.xxx,但因为服务器上已经有一个同名的文件,Django会把它保存为somefile_1.xxx。这样我就无法返回somefile_1.xxx,而是只能得到原始文件名。以下是我目前的代码。
admin.py
def add_view(self, request, form_url="", extra_context=None):
...
ModelForm = self.get_form(request)
if request.method == 'POST':
form = ModelForm(request.POST, request.FILES)
if form.is_valid():
url = MEDIA_URL+'files/'+request.FILES['filename'].name
url = iri_to_uri(url)
title = form.cleaned_data['title']
name = request.FILES['filename'].name
newname = os.path.splitext(request.FILES['filename'].name)[0]
data = utils.convert(url, title, newname)
print data
return super(FileAdmin, self).add_view(request, form_url="", extra_context=extra_context)
解决方案:
def save_model(self, request, obj, form, change):
...
obj.save()
url = obj.video.url
title = obj.title
newname = str(obj.id)
data = utils.convert(url, title, newname)
print data
2 个回答
1
FileField 有一个叫做 url 的功能,可以帮你获取你想要的东西,我想是这样。
你可以查看存储部分的第 3 点。
1
add_view
是在保存之前的操作,所以文件应该还在内存中,这时候还不需要设置文件名。
你需要重写 ModelAdmin.save_model
方法,并在调用 obj.save()
之后访问文件,以防万一 Django 改了你的文件名。