下载django数据模型为csv

时间:2018-01-30 09:38:44

标签: python django django-models django-forms django-views

如何转换从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。

1 个答案:

答案 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只是示例,请适当地替换那些具有您的字段名称。