Python 从xhtml2pdf导入pisa时出现问题

Python 从xhtml2pdf导入pisa时出现问题,python,django,Python,Django,我正在尝试Django在线教程中的以下代码。一切正常,但当我从xhtml2pdf导入“pisa”时,我得到一个错误,“导入xhtml2pdf无法解决”。可能是什么问题?我已经安装了xhtml2pdf。我还需要另一个python文件吗?请帮助我解决此问题。 from django.shortcuts import render, get_object_or_404 from profiles.models import Profile from django.http import JsonRes

我正在尝试Django在线教程中的以下代码。一切正常,但当我从xhtml2pdf导入“pisa”时,我得到一个错误,“导入xhtml2pdf无法解决”。可能是什么问题?我已经安装了xhtml2pdf。我还需要另一个python文件吗?请帮助我解决此问题。

from django.shortcuts import render, get_object_or_404
from profiles.models import Profile
from django.http import JsonResponse
from .utils import get_report_image
from .models import Report
from django.views.generic import ListView, DetailView, TemplateView
from .forms import ReportForm

from django.conf import settings
from django.http import HttpResponse
from django.template.loader import get_template
from xhtml2pdf import pisa

from sales.models import Sale, Position, CSV
from products.models import Product
from customers.models import Customer
import csv
from django.utils.dateparse import parse_date

from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin

class ReportListView(LoginRequiredMixin, ListView):
    model = Report
    template_name = 'reports/main.html'

class ReportDetailView(LoginRequiredMixin, DetailView):
    model = Report
    template_name = 'reports/detail.html'

class UploadTemplateView(LoginRequiredMixin, TemplateView):
    template_name = 'reports/from_file.html'

@login_required
def csv_upload_view(request):
    print('file is being')

    if request.method == 'POST':
        csv_file_name = request.FILES.get('file').name
        csv_file = request.FILES.get('file')
        obj, created = CSV.objects.get_or_create(file_name=csv_file_name)

        if created:
            obj.csv_file = csv_file
            obj.save()
            with open(obj.csv_file.path, 'r') as f:
                reader = csv.reader(f)
                reader.__next__()
                for row in reader:
                    data = "".join(row)
                    data = data.split(';')
                    data.pop()
        
                    transaction_id = data[1]
                    product = data[2]
                    quantity = int(data[3])
                    customer = data[4]
                    date = parse_date(data[5])

                    try:
                        product_obj = Product.objects.get(name__iexact=product)
                    except Product.DoesNotExist:
                        product_obj = None

                    if product_obj is not None:
                        customer_obj, _ = Customer.objects.get_or_create(name=customer) 
                        salesman_obj = Profile.objects.get(user=request.user)
                        position_obj = Position.objects.create(product=product_obj, quantity=quantity, created=date)

                        sale_obj, _ = Sale.objects.get_or_create(transaction_id=transaction_id, customer=customer_obj, salesman=salesman_obj, created=date)
                        sale_obj.positions.add(position_obj)
                        sale_obj.save()
                return JsonResponse({'ex': False})
        else:
            return JsonResponse({'ex': True})

    return HttpResponse()

@login_required
def create_report_view(request):
    form = ReportForm(request.POST or None)
    if request.is_ajax():
        image = request.POST.get('image')
        img = get_report_image(image)
        author = Profile.objects.get(user=request.user)

        if form.is_valid():
            instance = form.save(commit=False)
            instance.image = img
            instance.author = author
            instance.save()

        return JsonResponse({'msg': 'send'})
    return JsonResponse({})

@login_required


def render_pdf_view(request, pk):
    template_path = 'reports/pdf.html'
    obj = get_object_or_404(Report, pk=pk)
    context = {'obj': obj}
        # Create a Django response object, and specify content_type as pdf
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="report.pdf"'
        # find the template and render it.
    template = get_template(template_path)
    html = template.render(context)

        # create a pdf
    pisa_status = pisa.CreatePDF(
    html, dest=response)
        # if error then show some funy view
    if pisa_status.err:
        return HttpResponse('We had some errors <pre>' + html + '</pre>')
    return response



从django.shortcuts导入渲染、获取对象或404
从profiles.models导入配置文件
从django.http导入JsonResponse
从.utils导入获取报告图像
from.models导入报告
从django.views.generic导入ListView、DetailView、TemplateView
from.forms导入报表表单
从django.conf导入设置
从django.http导入HttpResponse
从django.template.loader导入get_模板
从xhtml2pdf导入pisa
从sales.models导入销售、职位、CSV
从产品。模型导入产品
来自客户。模型导入客户
导入csv
从django.utils.dateparse导入parse_date
从django.contrib.auth.decorators导入所需的登录名
从django.contrib.auth.mixins导入登录名RequiredMixin
类ReportListView(LoginRequiredMixin,ListView):
模型=报告
模板名称='reports/main.html'
类ReportDetailView(LoginRequiredMixin,DetailView):
模型=报告
模板名称='reports/detail.html'
类UploadTemplateView(LoginRequiredMixin,TemplateView):
模板名称='reports/from_file.html'
@需要登录
def csv_上传_视图(请求):
打印('正在打印文件')
如果request.method==“POST”:
csv_file_name=request.FILES.get('file').name
csv_file=request.FILES.get('file'))
obj,created=CSV.objects.get\u或\u create(文件名=CSV\u文件名)
如果创建:
obj.csv_文件=csv_文件
obj.save()
打开(obj.csv_file.path,'r')作为f:
读卡器=csv。读卡器(f)
读卡器。下一个
对于读取器中的行:
data=“”.join(世界其他地区)
data=data.split(“;”)
data.pop()
事务id=数据[1]
产品=数据[2]
数量=整数(数据[3])
客户=数据[4]
日期=解析日期(数据[5])
尝试:
product\u obj=product.objects.get(name\u iexact=product)
除Product.DoesNotExist外:
product_obj=无
如果产品_obj不是无:
customer\u obj,\u=customer.objects.get\u或\u create(name=customer)
sallers_obj=Profile.objects.get(user=request.user)
位置对象=位置对象创建(产品=产品对象,数量=数量,创建日期)
销售对象,销售对象,获取或创建(交易id=交易id,客户=客户对象,销售人员=销售对象,创建日期)
销售对象位置。添加(位置对象)
销售对象保存()
返回JsonResponse({'ex':False})
其他:
返回JsonResponse({'ex':True})
返回HttpResponse()
@需要登录
def创建报告视图(请求):
表单=报表表单(request.POST或None)
if request.is_ajax():
image=request.POST.get('image')
img=获取报告图像(图像)
author=Profile.objects.get(user=request.user)
如果form.is_有效():
instance=form.save(commit=False)
instance.image=img
instance.author=作者
save()实例
返回JsonResponse({'msg':'send'})
返回JsonResponse({})
@需要登录
def render_pdf_视图(请求、主键):
模板路径='reports/pdf.html'
obj=获取对象或404(报告,主键=主键)
上下文={'obj':obj}
#创建Django响应对象,并将内容类型指定为pdf
response=HttpResponse(content\u type='application/pdf')
响应['Content-Disposition']='附件;filename=“report.pdf”'
#找到模板并渲染它。
模板=获取模板(模板路径)
html=template.render(上下文)
#创建pdf
pisa_status=pisa.CreatePDF(
html,dest=响应)
#如果出现错误,则显示一些有趣的视图
如果pisa_status.err:
返回HttpResponse('我们有一些错误'+html+'')
返回响应