Django: доступ к единственному объекту модели, переданному в DetailView, для манипулирования значениями его атрибутов - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь получить доступ к объекту, используемому в Django DetailView и используемому для отображения данных модели.

Я могу получить доступ к объекту в html-шаблоне с помощью {{ object.product_name }}.

Но как мне получить доступ к объекту в функции, как показано ниже? (внутри 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 голосов
/ 18 декабря 2018
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 голосов
/ 07 февраля 2019

Полезный ответ, если кто-то хочет получить доступ к контексту и использовать его в качестве переменных: Доступ к глобальной переменной в представлении с помощью процессора контекста в Django

Добавить путь к методу процессора контекста(folder.context_processor.application_context) в TEMPLATE_CONTEXT_PROCESSORS.

в моем случае application_context - это метод, который я определил внутри файла context_processor.py, а метод "application_context" возвращает {'title': 'mytitle'}

если вы хотите использовать «title» как глобальную переменную в представлениях, используйте его следующим образом:

global_var = RequestContext(request).get("app_config")
titles = global_var.get("titles")
print titles

Другой полезный ответ здесь: Django: Как предоставить контекст для всех представлений(не шаблоны)?

0 голосов
/ 18 декабря 2018

Метод 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)

Если вы хотите просто напечатать его, здесь нет необходимости для ответа.

...