Django:访问传递到DetailView中的单个模型对象以操纵其属性的值

时间:2018-12-18 05:01:01

标签: python django django-class-based-views reportlab detailview

我正在尝试访问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

3 个答案:

答案 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)?