我试图访问在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_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)
如果你只想打印出来,无需响应这里。
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)
这可能是你在找什么
一个有用的答案,如果一个人想访问上下文,并以此作为变量: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”返回内部所限定的方法{“标题”:“mytitle”}
如果你想使用“标题”,如意见全局变量以这种方式使用它
global_var = RequestContext(request).get("app_config") titles = global_var.get("titles") print titles
另一个有用的答案就在这里:Django: How to provide context to all views (not templates)?