我正在尝试将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]
答案 0 :(得分:1)
这里有几个错误。
主要的一点是ModelAdmin操作方法的签名不是self, obj, request
而是self, request, queryset
。所以你把请求传递到错误的位置,这就解释了为什么Django说这是缺少错误的请求。
另请注意,最终参数是 queryset ,而不是对象。这是因为对所有选中复选框的项目调用了管理操作。因此,您需要遍历查询集并对每个项执行某些操作。当您的操作创建查询集时,我不确定您希望如何工作;很可能你的行动不是你想要的。
目前,CreatePdf实际上不是一个视图,所以我不知道你为什么要继承视图类;它可以直接从对象继承。但是,另一种方法是将其作为实际视图,通过get_urls()
method注册。