【发布时间】:2020-10-18 20:38:04
【问题描述】:
我已经使用 django 和 JavaScript 上传了目录。现在我正在尝试从 django admin 下载这个目录。为此,我关注了此链接click here。当我在 django 中上传目录时,管理员创建了下表。文件名表示上传的文件夹名称。
如果我单击文件名,它会显示以下错误。我想从 django admin 下载这个目录作为 zip 文件。谁能帮我解决这个问题?
这是我的 model.py:
class Prearchive(models.Model):
file = models.FileField(upload_to='media/', null=True)
file_name = models.CharField(max_length=500,primary_key=True)
file_id = models.ForeignKey(CreateScan, on_delete=models.CASCADE,default=1)
def _str_(self):
return self.file_name
admin.py:
from django.contrib import admin
from .models import CreateScan, Prearchive
# Register your models here.
class PrearchiveAdmin(admin.ModelAdmin):
model=Prearchive
list_display = ('file_name','file_id','file_link')
def file_link(self, obj):
if obj.file:
return "<a href='%s' download>Download</a>" % (obj.file.url,)
else:
return "No attachment"
file_link.allow_tags = True
file_link.short_description = 'File Download'
admin.site.register(Prearchive , PrearchiveAdmin)
view.py:
@login_required
def downloadScanView(request,url):
print('url',url)
response = HttpResponse(content_type='application/zip')
file_path = os.path.join(settings.MEDIA_ROOT, url)
zip_download = ZipFile(response, 'w',ZIP_DEFLATED)
if os.path.exists(file_path):
for root, dir, files in os.walk(file_path):
print('r = ',root)
for file in files:
zip_download.write(os.path.join(root,file))
response['Content-Disposition'] = 'attachment; filename={}'.format(os.path.basename(url)+'.zip')
return response
【问题讨论】:
-
Celery 任务将这些文件压缩到一个 tmp 位置,然后通过在 24 小时内到期的电子邮件中通知文件准备就绪,然后删除这些临时压缩文件。
-
感谢您的回复。问题是当我进入这个网址时:127.0.0.1:8080/media/iit_0001_9_Unknown_aser4,我有这个“这里不允许目录索引”。错误。我什至看不到目录中的文件。如何使用此文件夹链接获取文件夹内的文件?
-
你不能访问这个 url,因为它没有在
django中定义,并且基本假设是,如果你正在使用 s3 或媒体存储来提供文件以供下载后端。您是否在settings.py文件夹中定义了媒体根目录? -
我正在使用媒体存储后端并在 settings.py 中定义它。这是在我的 setting.py 中:MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media')。我还在我的 url.py 中设置了这个(如果 settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) )。我已经修改了我的问题并在其中附加了我的下载视图代码。你能解释一下吗?提前致谢。
-
我不知道为什么会这样,但我得到的网址类似于:/media/folder_name。我的setting.MEDIA_ROOT 是:/User/project/media。因此,当我尝试使用 os.path.join() 时,它返回与 url (/media/folder_name) 相同的路径。它不加入带有 MEDIA_ROOT 路径的 url。
标签: python django-admin django-file-upload django-admin-actions directory-upload