如何从 django 中可用的大量 csv 文件中选择一个 csv 文件
Posted
技术标签:
【中文标题】如何从 django 中可用的大量 csv 文件中选择一个 csv 文件【英文标题】:How to choose a csv file from a number of csv files available in django 【发布时间】:2021-02-09 10:46:37 【问题描述】:我对 django 和 python 还是很陌生。 我在 django 项目的应用程序中有许多具有相同格式的不同 csv 文件。我想使用项目(网站)的超链接选择一个特定的文件。 我怎样才能做到这一点? 还有其他方法吗?
【问题讨论】:
请解释“我想使用项目(网站)的超链接选择特定文件”的意思。您想将文件作为静态文件提供,还是希望有人能够将 CSV 文件上传到您的网站? 我的项目中有 10 个 csv 文件(具有不同的数据但相同的元数据)。我想通过链接选择这些文件中的任何一个。我怎样才能做到这一点?是否需要以文件名结尾的网站链接(这可能听起来很荒谬)或其他内容? 如果文件附加到模型中,您可以使用模型的pk结尾的url来访问模型 @nihilok 他们没有附加模型,但我可以做到。你能解释更多或一些链接。 【参考方案1】:除了静态文件方法之外,为了回应要求更多信息的评论,
如果你这样创建model:
class CSVFile(models.Model):
file = models.FileField(upload_to='csv_files/')
然后您可以通过 django 管理员或以编程方式上传文件,并通过您的视图将模型实例作为上下文传递,例如
def view(request):
files = CSVFile.objects.all()
return render(request, 'template.html, 'files': files)
然后您可以有第二个视图来下载文件:
def download(request, pk):
csv = CSVFile.objects.filter(pk=pk).first()
filename = csv.file.name.split('/')[-1]
response = HttpResponse(csv.file, content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename=%s' % filename
return response
然后在urls.py中:
urlpatterns = [
path('', views.view, name='home'),
path('file/<int:pk>', views.download, name='download'),
]
然后在模板中:
<body>
<h1>Download your CSVs!</h1>
% for file in files %
<p><a href="% url 'download' pk=file.pk %"><button type="button">Download file.file.name </button></a></p>
% endfor %
</body>
看起来像这样:
最后一件事,在将文件保存到模型之前,请在 settings.py 中设置媒体根目录,如下所示:
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
查看更多关于字段here 并一直向下滚动到/搜索 FileField,here 用于管理模型中的文件
【讨论】:
嘿@nihilok 感谢您的帮助。你能告诉如何在views.py中打开这个(file = CSVFile.objects.filter(id=?).first()) csv文件。我找不到这个解决方案。 这取决于你想用它做什么。如果它在 python 代码中,你可能根本不需要使用 'django' 方法。如果您只想从模板访问文件,我将在我的答案中添加一些更具体的示例【参考方案2】:您在问如何提供静态文件。详情请阅读documentation。
如果您在离线服务器上执行此操作,您只需定义 Django 可以在项目设置页面上找到静态资产(文件夹名称)的位置。为此,您可以将STATIC_URL = '/static/'
放入您的设置中,然后将所有 csv 文件放入名为static
的文件夹中,该文件夹应位于项目的根目录中。然后,您可以使用 %static% 标签访问您的文件并获取它们的 URL。对于部署,您还需要在设置中定义 STATIC_ROOT
。
如果您需要在生产环境中提供静态文件,您可以使用 whitenoise 之类的内容以方便使用。
【讨论】:
以上是关于如何从 django 中可用的大量 csv 文件中选择一个 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 csv.DictReader 在 django 中上传和读取 csv 文件?