【问题标题】:Django GeneratePDF with xhtml2pdf - Method not allowed (GET)Django GeneratePDF with xhtml2pdf - 不允许的方法(GET)
【发布时间】:2018-06-11 08:52:27
【问题描述】:

我将修改以下 类 GeneratePDF 以呈现动态生成的模板

在 myproject/myapp/utils.py

from io import BytesIO
from django.http import HttpResponse
from django.template.loader import get_template
from xhtml2pdf import pisa

def render_to_pdf(template_src, context_dict={}):
    template = get_template(template_src)
    html  = template.render(context_dict)
    result = BytesIO()
    pdf = pisa.pisaDocument(BytesIO(html.encode("ISO-8859-1")), result)
    if not pdf.err:
        return HttpResponse(result.getvalue(), content_type='application/pdf')
    return None

views.py

class GeneratePDF(View):
def get(self, request, *args, **kwargs):
    template = get_template('invoice.html')
    context = {
        "invoice_id": 123,
        "customer_name": "John Cooper",
        "amount": 1399.99,
        "today": "Today",
    }
    html = template.render(context)
    pdf = render_to_pdf('invoice.html', context)
    if pdf:
        response = HttpResponse(pdf, content_type='application/pdf')
        filename = "Invoice_%s.pdf" %("123")
        content = "inline; filename='%s'" %(filename)
        download = request.GET.get("download")
        if download:
            content = "attachment; filename='%s'" %(filename)
        response['Content-Disposition'] = content
        return response
    return HttpResponse("Not found")

我使用以下内容生成我的模板:

class MyReport(ListView):
model = Reports
template_name = 'myreports.html' 
context_object_name = 'myreports'  
def get_context_data(self, *args,**kwargs):
    context = super(MyReport, self).get_context_data(*args,**kwargs)
    context['reports'] = Reports.objects.all().values('id','idsys','itemcode','ordercode').filter(id=self.kwargs['id'],idsys=self.kwargs['idsys'])
    return context

我正在尝试生成修改了以下类的 PDF:

class GeneratePDF(View):
def get_context_data(self, *args,**kwargs):
    template = get_template('myreports.html')
    context = super(GeneratePDF, self).get_context_data(*args,**kwargs)
    context['reports'] = Reports.objects.all().values('id','idsys','itemcode','ordercode').filter(id=self.kwargs['id'],idsys=self.kwargs['idsys'])

    html = template.render(context)
    pdf = render_to_pdf('myreports.html', context)
    if pdf:
        response = HttpResponse(pdf, content_type='application/pdf')
        filename = "myreports_%s.pdf" %("1")
        content = "inline; filename='%s'" %(filename)
        download = request.GET.get("download")
        if download:
            content = "attachment; filename='%s'" %(filename)
        response['Content-Disposition'] = content
        return response
    return HttpResponse("Not found")

urls.py

url(r'^reports_pdf/(?P<id>\d+)/(?P<idsys>\d+)/$', views.GeneratePDF.as_view())

但我收到 错误:不允许方法 (GET) 你有什么建议吗?谢谢

(我关注了这个:Render_to_PDF_in_Django

【问题讨论】:

    标签: django xhtml2pdf


    【解决方案1】:

    您收到此错误是因为您继承自 View 类,默认情况下未实现 get() 方法。这意味着您的视图不知道如何处理GET 请求,并引发错误。要解决问题,您需要为GeneratePDF 类定义get() 方法。只有在此之后GeneratePDF 才能处理GET 请求。同样View 类不提供get_context_data 方法,您可以删除此context = super(GeneratePDF, self).get_context_data(*args,**kwargs) 并将其替换为简单的上下文定义为空字典context={}

    class GeneratePDF(View):
        def get(self, *args,**kwargs):
            template = get_template('myreports.html')
            context = {}
            context['reports'] = Reports.objects.all().values('id','idsys','itemcode','ordercode').filter(id=self.kwargs['id'],idsys=self.kwargs['idsys'])
    
            html = template.render(context)
            pdf = render_to_pdf('myreports.html', context)
            if pdf:
                response = HttpResponse(pdf, content_type='application/pdf')
                filename = "myreports_%s.pdf" %("1")
                content = "inline; filename='%s'" %(filename)
                download = request.GET.get("download")
                if download:
                    content = "attachment; filename='%s'" %(filename)
                response['Content-Disposition'] = content
                return response
            return HttpResponse("Not found")
    

    【讨论】:

    • 非常感谢您的回复,我测试了它并收到以下错误:在模板中使用了{% csrf_token %},但上下文没有提供值。这通常是由于没有使用 RequestContext 造成的。 “模板中使用了 {% csrf_token %},但上下文“需要有效的文件名! '' 需要一个有效的文件名! '' '' 显然它是由 MyReport 类以 html 格式正确生成的
    • @Mixo 看起来您还需要向模板提供 requesthtml = template.render(context, self.request)
    • @Mixo 你更新了render_to_pdf 方法吗?
    • @neverwalkaloner 我用包含方法 render_to_pdf 的 utils.py 描述编辑了我的帖子
    • @Mixo 您还应该向它添加请求 def render_to_pdf(template_src, context_dict={}, request=None): 并在其中添加:html = template.render(context_dict, request)
    猜你喜欢
    • 2019-04-19
    • 2019-06-27
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    相关资源
    最近更新 更多