【发布时间】:2019-05-18 11:52:18
【问题描述】:
我正在尝试访问在 Django DetailView 中使用并用于显示模型数据的对象。
我可以通过{{ object.product_name }}访问html模板中的对象。
但是,我如何访问函数中的对象,如下所示? (在 views.py 中).
def access_object_values(self):
name = object.product_name
(我的尝试失败了,我得到: WSGIRequest'对象没有属性)
。 .
我的设置:
*models.py*
class Product(models.Model):
product_name = models.Charfield(max_length=20)
product_price = models.FloatField(max_length=12, default=100)
*urls.py*
path('product/<int:pk>/', ProductView.as_view(), name='product-detail)
我的尝试:
class ProductView(DetailView):
model = Product
template_name = 'product/product_detail.html'
def get_object(self, queryset=None):
if queryset is None:
queryset = self.get_queryset()
obj = super(ProductView, self).get_object(queryset=queryset)
return obj
def get(self, obj, *args, **kwargs):
return self.generate_pdf(obj)
# TO VISUALLY GET FEEDBACK OF SUCCESS OR NOT
# ==========================================
def generate_pdf(self, obj):
from reportlab.pdfgen import canvas
response = HttpResponse(content_type='application/pdf')
response['pdf'] = 'attachment; filename="summary.pdf"'
p = canvas.Canvas(response)
# name = getattr(obj, 'product_name') # produces 'WSGIRequest' object has no attribute 'product_name'
# name = obj.product_name # produces 'WSGIRequest' object has no attribute 'product_name'
# name = type(obj) # produces 'WSGIRequest' has no attribute 'decode
name = "text" # this works, and it prints
p.drawString(100, 100, name)
p.showPage()
p.save()
print(p)
return response
【问题讨论】:
-
你想达到什么目标可以让我更清楚。如果您在页面加载中需要任何内容,您可以尝试覆盖 get_contextdata 方法并添加响应
-
嗨 Midhun,鉴于您的问题,我重新写了一点:“”而不是主要兴趣在模板中显示数据,例如 {{ object.product_name }},重点这里是访问对象内的数据值,用于另一个子例程,例如打印文档或计算值: "" ,即如何访问用于模板的对象详细视图,而不是编写另一个/新的数据库请求来再次询问对象
-
在你的获取对象方法中试试这个 obj = super().get_object(queryset=self.model.objects.get(pk=self.kwargs.get("pk"))) @jaco i会更清楚,因为它是详细视图
-
得到一个错误'Product'对象没有属性'filter',我以为我拥有的版本会直接到达特定对象,而不使用过滤器,但似乎不起作用,,obj = super(ProductView, self).get_object(queryset=queryset)
-
发现如果queryset为None,你需要使用这个:queryset = self.get_queryset()
标签: python django django-class-based-views reportlab detailview