我正在尝试访问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
答案 0 :(得分:1)
方法get_object
应该返回一个对象。
试试:
def get_object(self, queryset=None):
obj = super(ProductView, self).get_object(queryset=queryset)
self.generate_pdf(obj)
return obj
def generate_pdf(self, obj):
from reportlab.pdfgen import canvas
p = canvas.Canvas(response)
name = obj.product_name
p.drawString(100, 100, name )
p.showPage()
p.save()
print(p)
如果您只想打印它,则无需在此处进行回复。
答案 1 :(得分:1)
def get_object(self, queryset=None):
if queryset is None:
queryset = self.get_queryset()
obj = super(ProductView, self).get_object(queryset=queryset)
self.generate_pdf(obj)
return obj
def generate_pdf(self, obj):
from reportlab.pdfgen import canvas
p = canvas.Canvas(response)
name = obj.product_name
p.drawString(100, 100, name )
p.showPage()
p.save()
print(p)
这可能就是您要寻找的
答案 2 :(得分:0)
一个有用的答案,如果要访问上下文并将其用作变量:Accessing global variable in view using context processor in Django
将上下文处理器方法路径(folder.context_processor.application_context)添加到 TEMPLATE_CONTEXT_PROCESSORS。
在我的情况下,application_context是我在其中定义的方法 文件context_processor.py和方法“ application_context”返回 {'titles':'mytitle'}
如果要在视图中使用“ title”作为全局变量,请在此使用 方式
global_var = RequestContext(request).get("app_config") titles = global_var.get("titles") print titles
另一个有用的答案是在这里: Django: How to provide context to all views (not templates)?