我想将模型对象数据中的详细信息打印到 pdf 中
我已经用谷歌搜索了很多,以确保是否有人之前遇到过这个问题,但我找到的大多数答案都不是我的问题的解决方案
models.py
class Direct(models.Model):
type=models.CharField(max_length=128,null=True,blank=True)
name=models.CharField(max_length=128)
price=models.IntegerField()
meters=models.DecimalField(null=True,blank=True,max_digits=5,
decimal_places=2)
discount=models.IntegerField(null=True)
phone_number=models.BigIntegerField(null=True)
type2=models.CharField(max_length=128,null=True,blank=True)
meters2=models.DecimalField(null=True,blank=True,max_digits=5,
decimal_places=2)
price2=models.IntegerField(null=True,blank=True)
discount2=models.IntegerField(null=True,blank=True)
views.py
def admin_order_pdf(request, order_id, *args, **kwargs):
queryset=D.objects.all()
# serializer=
# order=D.objects.get(order_id)
order = get_object_or_404(queryset, id=order_id)
type=order.type
price=order.price
meters =order.meters
price=price*meters
discount=order.discount
total=price-discount
type2=order.type2
price2=order.price2
meters2=order.meters2
if price2 != None:
price2=price2*meters2
return price2
else:
price2=None
discount2=order.discount2
if discount2 != None:
total2=price2-discount2
return total2
else:
discount2=None
total2=None
# print()
template=get_template('bill/b.html')
data={
'order': order,'total':total,'type':type,'price':price,'meters':meters,'discount':discount,'type2':type2,'price2':price2,'discount2':discount2,'total2':total2,'meters2':meters2
}
html = render_to_pdf('bill/b.html', data)
return HttpResponse(html, content_type='application/pdf')
每当有两个产品时,type2 产品会将值返回到上下文中,稍后可以在模板中使用,但如果只有产品,那么 type2 应该返回 None ,这样我就可以使用 django 模板过滤器在我的 html 中忽略这个类型 2。
完整跟踪簿
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/pro/bill/8/pdf/
Django Version: 2.1.4
Python Version: 3.6.4
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'bill',
'rest_framework']
Installed Middleware:
('whitenoise.middleware.WhiteNoiseMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware')
Traceback:
File "C:Usersmadhumaniworkspacebilling-masterlibsite-packagesdjangocorehandlersexception.py" in inner
34. response = get_response(request)
File "C:Usersmadhumaniworkspacebilling-masterlibsite-packagesdjangoutilsdeprecation.py" in __call__
93. response = self.process_response(request, response)
File "C:Usersmadhumaniworkspacebilling-masterlibsite-packagesdjangomiddlewareclickjacking.py" in process_response
26. if response.get('X-Frame-Options') is not None:
Exception Type: AttributeError at /pro/bill/8/pdf/
Exception Value: 'float' object has no attribute 'get'
您从视图中返回的内容不是HttpResponse
实例。 这会导致中间件堆栈中出现错误,因为中间件期望接收HttpResponse
实例。
if price2 != None:
price2=price2*meters2
return price2 # this won't work!
else:
price2=None
discount2=order.discount2
if discount2 != None:
total2=price2-discount2
return total2 # this won't work!
如果要将这些值返回到浏览器,请将它们包装在 HttpResponse 中,如下所示:
if price2 != None:
price2=price2*meters2
return HttpResponse(str(price2), content_type="text/plain")
else:
price2=None
discount2=order.discount2
if discount2 != None:
total2=price2-discount2
return HttpResponse(str(total2), content_type="text/plain")
如果您不想将这些值返回到浏览器 - 也许您只想设置要在模板中使用的值 - 请删除 return 语句。