Django的:访问传入的DetailView单一模型对象及其属性的值的操作

问题描述 投票:0回答:3

我试图访问在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
python django django-class-based-views reportlab detailview
3个回答
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
投票
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)

这可能是你在找什么


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”返回内部所限定的方法{“标题”:“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)?

© www.soinside.com 2019 - 2024. All rights reserved.