' WSGIRequest'对象没有属性' some_attribute'

时间:2017-12-04 20:30:58

标签: python django

我正在尝试将html渲染为pdf并将其作为django动作包含在内,但是,由于某些奇怪的原因,我似乎不断遇到对象没有属性的问题' some_attribute'。

我的观点如下:

class CreatePdf(ContextMixin, View):
    def get_context_data(self, obj, request):
        cxt = {'some_attribute': obj.some_attribute,
                'today': date.today()}
        return cxt

    def create_pdf(self, some_template, some_dict={}):
        template = get_template(some_template)
        html  = template.render(some_dict)
        result = BytesIO()
        pdf = pisa.pisaDocument(BytesIO(html.encode("ISO-8859-1")), result)
        if not pdf.err:
            return HttpResponse(result.getvalue())
        return None        

这个动作,其目的是调用一切并完成所有魔法,看起来像这样:

def get_pdf(self, obj, request):
    pdf_view = views.CreatePdf()
    pdf = pdf_view.create_pdf('templates/some_template.html', pdf_view.get_context_data(obj,request))
    return HttpResponse(pdf)

我想,使用get_context_data会在admin字段中获取所选对象的字段,但是,我似乎也遇到了同样的错误。

最后,但并非最不重要的是,在admin.py我有:

class MyAdmin(admin.ModelAdmin):
    actions = [get_pdf]

1 个答案:

答案 0 :(得分:1)

这里有几个错误。

主要的一点是ModelAdmin操作方法的签名不是self, obj, request而是self, request, queryset。所以你把请求传递到错误的位置,这就解释了为什么Django说这是缺少错误的请求。

另请注意,最终参数是 queryset ,而不是对象。这是因为对所有选中复选框的项目调用了管理操作。因此,您需要遍历查询集并对每个项执行某些操作。当您的操作创建查询集时,我不确定您希望如何工作;很可能你的行动不是你想要的。

目前,CreatePdf实际上不是一个视图,所以我不知道你为什么要继承视图类;它可以直接从对象继承。但是,另一种方法是将其作为实际视图,通过get_urls() method注册。