在django admin中获取上传文件的URL

时间:2012-01-18 08:09:07

标签: python django

我有一个应用程序,我使用Django的管理站点上传文件。我需要返回文件的url,以便其他函数可以使用它。除了我能够获取原始文件的名称而不是应用程序保存的文件之外,该过程工作得很好。例如,如果要上传的文件名为somefile.xxx,并且django将其保存为somefile_1.xxx,因为somefile.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 个答案:

答案 0 :(得分:1)

add_view是预先保存的 - 因此文件应该在内存中,因此不应该设置文件名。

您需要覆盖ModelAdmin.save_model并在致电obj.save()后访问该文件,以说明django重命名您的文件的可能性。

答案 1 :(得分:0)

FileField有一个url函数来准确检索你想要的东西 https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.FileField.storage

请参阅存储部分

下的第3点