首页 > 解决方案 > /pro/bill/8/pdf/ 'decimal.Decimal' 对象的 AttributeError 没有属性 'get'

问题描述

我想将模型对象数据中的详细信息打印到 pdf

我用谷歌搜索了很多以确定是否有人早些时候遇到过这个问题,但我发现的大多数答案都不是我的问题的解决方案

模型.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)

视图.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:\Users\madhumani\workspace\billing-master\lib\site-packages\django\core\handlers\exception.py" in inner
      34.             response = get_response(request)

    File "C:\Users\madhumani\workspace\billing-master\lib\site-packages\django\utils\deprecation.py" in __call__
      93.             response = self.process_response(request, response)

    File "C:\Users\madhumani\workspace\billing-master\lib\site-packages\django\middleware\clickjacking.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'

标签: pythondjangodjango-views

解决方案


您正在从不是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 语句。


推荐阅读