在Django中导出CSV

时间:2014-06-11 19:12:08

标签: python django csv django-cms

我目前正在尝试从django cms插件导出csv文件。唯一的问题是我不知道我应该如何从渲染函数中返回一个HttpResponse。

非常感谢任何和所有帮助!

cms_plugins.py

from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool
from data_viewer.models.data_view import DataPlugin
from django.utils.translation import ugettext as _
from django.db.models import Q
from django.core.paginator import Paginator
import base64
from django.http import HttpResponse
import csv

class CMSDataPlugin(CMSPluginBase):
    model = DataPlugin
    name = _("Data Viewer")
    render_template = "data_viewer/default.html"

    def makeQstring(self, qlist, q):
        out = []
        for fd in qlist:
            out.append("Q(%s__icontains='%s')" % (fd, q))

        return ' | '.join(out)

    def render(self, context, instance, placeholder):
        is_csv = context['request'].GET.get('csv', False)

        if is_csv == 'true':
            response = HttpResponse(content_type='text/csv')
            response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'

            writer = csv.writer(response)
            writer.writerow(['First row', 'Foo', 'Bar', 'Baz'])
            writer.writerow(['Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"])

            context = response !!!!! I need to return this response, but render can only return a context object

        else:    
            gridData = dict()
            qList = False
            G = context['request'].GET
            q = G.get('find', False)
            paNum = G.get('p',1)
            if q == False:
                q = G.get('q', False)
            if q and instance.filter_fields:
                qList = instance.filter_fields.strip().split(',')

            ordBy = ''
            if G.get('o', False):
                ordBy = ".order_by('%s')" % G.get('o')

            if instance and instance.layout:
                self.render_template = "data_viewer/"+instance.layout
                exec("from data_viewer.models.%s import %s as GridData" % (instance.source, instance.name))

                if GridData and instance.init_filter:
                    if instance.init_filter.strip().startswith('Q') and qList:
                        instance.filter += ' & (%s)' % self.makeQstring(qList, q)
                    gridData = eval("GridData.objects.filter(%s)%s" % (instance.init_filter, ordBy))
                elif GridData and qList:
                    gridData = eval("GridData.objects.filter(%s)%s" % (self.makeQstring(qList, q), ordBy))
                elif GridData:
                    gridData = eval("GridData.objects.all()%s" % ordBy)        

                pg = Paginator(gridData, instance.page_count)
            conObj ={
                'data':pg.page(paNum),
                'pagination':pg,
                'search':{
                    'q':q,
                    'p':paNum,
                    'o':G.get('o',False),
                },
                'object':instance,
                'placeholder':placeholder
            }
            print instance.name
            if instance.name == 'PublicContactCards':
                print 'adding contacts'
                import vobject
                conObj['cards'] = []
                for d in conObj['data']:
                    vcard = vobject.readOne(d.carddata)
                    conObj['cards'].append(vcard)

            context.update(conObj)
        return context

plugin_pool.register_plugin(CMSDataPlugin)

1 个答案:

答案 0 :(得分:-2)

为什么你不必重新使用轮子?

您可以使用django-import-export包。

https://github.com/bmihelac/django-import-export