【问题标题】:Django: Access the single model object passed into DetailView for manipulation of its attributes' valuesDjango:访问传递给 DetailView 的单个模型对象以操作其属性值
【发布时间】: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


【解决方案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)

如果你只想打印,这里不需要回复。

【讨论】:

  • 谢谢,它把我带到了正确的方向,在这种情况下,打印带有对象值的 pdf 是重点
  • 我很高兴。如果有帮助,请将我的答案标记为有用或解决方案。祝你好运!
【解决方案2】:
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)

这可能就是你要找的东西

【讨论】:

  • 谢谢,我已经尝试过了,它让我领先,但不是全部,因为我无法质疑该对象,请参阅我修改后的问题以获得您的帮助。
【解决方案3】:

如果想访问上下文并将其用作变量,这是一个有用的答案: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)?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 2014-11-16
    • 1970-01-01
    • 2011-01-22
    相关资源
    最近更新 更多