0

我正在尝试采用Django 文档示例,将基于类的视图与 mixins 结合使用,以便能够以一种简单的方式以 CSV 格式下载列表视图中的对象,但我失败得很惨,并没有真正看到什么我做错了。

我有一个定义为:

class MyObjectList(CSVResponseMixin,
                   MultipleObjectTemplateResponseMixin,
                   BaseListView
                   ):
    object_type = None
    def get_context_data(self, **kwargs):
        object_type = self.object_type
        ...some code...
        return context

    def render_to_response(self, context, **kwargs):
        if self.request.GET.get('format', '') == 'csv':
            return CSVReponseMixin.render_to_response(self, context, **kwargs)
        else:
            return MultipleObjectTemplateResponseMixin.render_to_response(self, context, **kwargs)

混合是:

class CSVResponseMixin(object):
    def render_to_response(self, ctx, **kwargs):
        return self.HttpResponse.render_to_response(self.convert_to_csv(ctx), **kwargs)

    def conver_to_csv(ctx):
        return do_csv_magic(ctx)

urls.py视图中称为:

url(r'^list/foos/$',
    MyObjectList.as_view(object_type="someobject", model=models.MyModel),
    name="myobjects",
)

但是,当我尝试在没有查询的情况下访问视图时?format=csv,我得到一个TypeError

Exception Value:  __init__() got an unexpected keyword argument 'request'
Exception Location: /usr/lib/python2.6/site-packages/django/views/generic/base.py in render_to_response, line 97

编辑:我在问题中添加了一些细节,最后用不同的方法实现了这个,但我仍然想知道我做错了什么。

4

2 回答 2

0

根据 docsrender_to_response仅采用以下参数:template_name, dictionary, context_instance, mimetype

因此,FooResponseMixin在您致电时:

self.HttpResponse.render_to_response(self.mutilate_context(ctx), **kwargs)

您在不接受的情况下传递了额外的kwargs参数render_to_response。删除**kwargs或仅将您需要的内容分配给变量以传递给接受的参数。

于 2012-08-23T19:04:13.193 回答
0

简而言之,你做得过火了。我不确定你在这里的意图是什么,但我了解到最好的方法是找到最接近你想要做的事情的通用视图,然后简单地将其扩展为views.py. 示例很多,但我邀请您在https://bitbucket.org/BerislavLopac/resume/src/d7cfcf9c370b/resume_app/myproject/web/views.py查看我的代码。

于 2012-08-23T22:25:15.103 回答