如何转换从Django站点收集的数据,并将其下载为.csv文件。我希望它能让django admin中有一个按钮,将所有数据下载为.csv文件
这是我的模特:
from django.db import models
class Auto(models.Model):
YNC = (
('N', 'No'),
('Y', 'Yes'),
)
NYC = (
('N', 'No'),
('Y', 'Yes'),
)
NNY = (
('N', 'No'),
('Y', 'Yes'),
)
nw = (
(1, 'Really Bad'),
(1, 'Bad'),
(3, 'Average'),
(4, 'Good'),
(5, 'Really Good'),
)
Team = models.CharField()
Scout = models.CharField()
StartWithCubeLoaded = models.CharField(max_length = 1, choices = YNC, default = 'N')
CrossAutoLine = models.CharField(max_length = 1, choices = YNC, default = 'N')
RobotCrossCenterLine = models.CharField(max_length = 1, choices = YNC, default = 'N')
PlaceCubeInWrongScale = models.CharField(max_length = 1, choices = YNC, default = 'N')
RobotHitOtherAllianceRobotInNullZone = models.CharField(max_length = 1, choices = YNC, default = 'N')
MisPlaceCube = models.CharField(max_length = 1, choices = YNC, default = 'N')
DroppedCubes = models.IntegerField(default = 0)
DoubleStackScale = models.CharField(max_length = 1, choices = NYC, default = 'N')
Foul = models.CharField(max_length = 1, choices = NYC, default = 'N')
KnockedOffCubes = models.IntegerField(default = 0)
MissedCubes = models.IntegerField(default = 0)
Climbed = models.CharField(max_length=1, choices=NNY, default = 'N')
ClimbTime = models.IntegerField(default=0)
Lifted2Robots = models.CharField(max_length=1, choices=NNY, default = 'N')
ProvidedBar = models.CharField(max_length=1, choices=NNY, default = 'N')
ProvidedRamp = models.CharField(max_length=1, choices=NNY, default = 'N')
GrabFieldBar = models.CharField(max_length=1, choices=NNY, default = 'N')
ClimbAttempted = models.CharField(max_length=1, choices=NNY, default = 'N')
GrabRobotBar = models.CharField(max_length=1, choices=NNY, default = 'N')
ClimbRobotRamp = models.CharField(max_length=1, choices=NNY, default = 'N')
NoShow = models.CharField(max_length=1, choices=NNY, default = 'N')
TippedOver = models.CharField(max_length=1, choices=NNY, default = 'N')
Broke = models.CharField(max_length=1, choices=NNY, default = 'N')
TeamWork = models.IntegerField(choices = nw, default = 'Really Bad')
PickingUpCubes = models.IntegerField(choices = nw, default = 'Really Bad')
Driving = models.IntegerField(choices = nw, default = 'Really Bad')
PlacingCubes = models.IntegerField(choices = nw, default = 'Really Bad')
views.py:
from django.shortcuts import render
from .models import Auto
from .forms import AutoForm
from django.shortcuts import render_to_response, get_object_or_404
def index(modeladmin, request, queryset):
form = AutoForm()
if request.method == "POST":
form = AutoForm(request.POST)
else:
form = AutoForm()
return render(request, 'index.html', {'form': form})
def dcsv(request):
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="filename.csv"'
writer = csv.writer(response)
writer.writerow(['column1','column2','column3'])
data = Auto.objects.filter()
for row in data:
rowobj = [row.column1,row.column2,row.column3]
writer.writerow(rowobj)
return response
urls.py:
from django.conf.urls import url
from django.contrib import admin
from system.views import index, dcsv
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', index),
url(r'^$', dcsv),
]
index.html:
<!DOCTYPE html>
<html>
<head>
<!-- UIkit CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.0.0-beta.38/css/uikit.min.css" />
<!-- UIkit JS -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.0.0-beta.38/js/uikit.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.0.0-beta.38/js/uikit-icons.min.js"></script>
<link href="https://fonts.googleapis.com/css?family=Abril+Fatface" rel="stylesheet">
<style>
.uk-logo{
font-family: 'Abril Fatface' !important;
color: black !important;
}
.qf{
font-family: 'Abril Fatface' !important;
color: black !important;
}
</style>
</head>
<body>
<nav class="uk-navbar-container uk-margin uk-navbar-transparent" uk-navbar="mode: click">
<div class="uk-navbar-left">
<a class="uk-navbar-item uk-logo" href="#">Nav</a>
<ul class="uk-navbar-nav">
<li class="uk-active"><a class="qf"href="#">Nav</a></li>
<li><a class="qf" href="#">Nav</a></li>
<li><a class="qf"href="#">Nav</a></li>
</ul>
</div>
</nav>
<h1></h1>
<form method="POST" class="post-form">{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="save btn btn-default">Save</button>
</form>
</body>
</html>
我在互联网上找到了答案,但他们使用的是较旧的django版本。我使用的django版本是1.11。
答案 0 :(得分:0)
创建另一个视图类/函数并将其定义到urls.py中,并将以下代码放入新的视图函数/类中。
需要在文件顶部导入
from django.http import HttpResponse
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="filename.csv"'
writer = csv.writer(response)
writer.writerow(['column1','column2','column3'])
data = Auto.objects.filter()
for row in data:
rowobj = [row.column1,row.column2,row.column3]
writer.writerow(rowobj)
return response
在html文件中添加链接或按钮并通过调用函数使用按钮导航链接或将表单操作更改为新URL。这将开始下载csv文件。
您似乎对django更新网址行
非常新url(r'dcsv', dcsv, {},name="dcsv"), instead of url(r'^$', dcsv),
和column1,column2,column3只是示例,请适当地替换那些具有您的字段名称。