【问题标题】:Django: How to search through django.template.context.RequestContextDjango:如何通过 django.template.context.RequestContext 进行搜索
【发布时间】:2021-01-08 15:41:52
【问题描述】:

我正在 Django 中进行测试并面临 ,我正在尝试迭代并在其中找到 对象。

test.py

  def test_ProductDetail_object_in_context(self):
    response = self.client.get(reverse('product_detail', args=[1]))

    # assertEqual - test passes
    self.assertEqual(response.context[0]['object'], Product.objects.get(id=1))

    # assertIn - test fails
    self.assertIn(Product.objects.get(id=1), response.context[0])

views.py

class ProductDetailView(DetailView):
model = Product

  def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)

    data = cartData(self.request)
    cartItems = data['cartItems']
    context['cartItems'] = cartItems
    return context

response.context 里面有什么:

[
[
    {'True': True, 'False': False, 'None': None}, 
    {'csrf_token': <SimpleLazyObject: <function csrf.<locals>._get_val at 0x7fd80>>, 
        'request': <WSGIRequest: GET '/1/'>, 
        'user': <SimpleLazyObject: <django.contrib.auth.models.AnonymousUser object at 0x7fd820>>, '
        perms': <django.contrib.auth.context_processors.PermWrapper object at 0x7fd80>, 
        'messages': <django.contrib.messages.storage.fallback.FallbackStorage object at 0x7fd8290>, 
        'DEFAULT_MESSAGE_LEVELS': {'DEBUG': 10, 'INFO': 20, 'SUCCESS': 25, 'WARNING': 30, 'ERROR': 40}
    }, 
    {}, 
    {'object': <Product: Pen>, 
        'product': <Product: Pen>, 
        'view': <ecom.views.ProductDetailView object at 0x7fd8210>, 
        'cartItems': 0}
], 
[
    {'True': True, 'False': False, 'None': None}, 
    {'csrf_token': <SimpleLazyObject: <function csrf.<locals>._get_val at 0x7fd8240>>, 
        'request': <WSGIRequest: GET '/1/'>, 
        'user': <SimpleLazyObject: <django.contrib.auth.models.AnonymousUser object at 0x7fd8250>>, 
        'perms': <django.contrib.auth.context_processors.PermWrapper object at 0x7fd8250>, 
        'messages': <django.contrib.messages.storage.fallback.FallbackStorage object at 0x7fd8290>, 
        'DEFAULT_MESSAGE_LEVELS': {'DEBUG': 10, 'INFO': 20, 'SUCCESS': 25, 'WARNING': 30, 'ERROR': 40}
    }, 
    {}, 
    {'object': <Product: Pen>, 
        'product': <Product: Pen>, 
        'view': <ecom.views.ProductDetailView object at 0x7fd8210>, 
        'cartItems': 0}
]

]

response.context 的类型:

<class 'django.template.context.RequestContext'>

Product.objects.get(id=1) 里面的内容是:Pen

Product.objects.get(id=1) 的类型是:&lt;class 'ecom.models.Product'&gt;

我不明白为什么:

  • 它在 self.assertEqual(response.context[0]['object'], Product.objects.get(id=1)) 中找到 Product 对象,但在 self.assertIn(Product.objects.get(id =1), response.context[0]['object']) - 说 TypeError: 'Product' 类型的参数不可迭代

  • 它也没有在 self.assertIn(Product.objects.get(id=1), response.context[0]) 中找到它 - 说“AssertionError: not found in [... .here 的内容是 response.context[0]....]"

  • 它也没有在 self.assertIn(Product.objects.get(id=1), response.context[0][3]) 中找到它 - 说“在 getitem 中引发 KeyError (key), KeyError: 3"

  • 如何使用 RequestContext 类? JSON 之类的?

抱歉,这个问题有点混乱,只是想了解如何使用 RequestContext。 提前谢谢!

【问题讨论】:

    标签: python django django-testing django-tests django-context


    【解决方案1】:

    我认为您的测试失败了,因为assertIn 查看的是 KEYS 而不是值。解决方案是:

    self.assertIn(Product.objects.get(id=1), response.context[0].values())
    

    更多解释:response.context[0] 似乎是一些键值存储,即字典。当您执行response.context[0]["object"] 时,您刚刚访问了键“object”处的值,其中response.context[0] 是字典。对字典做一些in 查询只会查找字典的键。

    【讨论】:

    • 谢谢你,你的回答真的很有帮助!我试过了,但不幸的是,它没有通过......我会试着找出原因
    • 嗯,我大概可以想象为什么?我不确定您的响应上下文是一个列表;我以为这是一本字典……就像看你的问题一样,它显示了两个我认为的请求上下文,因为它们是相同的,不是吗?
    猜你喜欢
    • 2016-01-08
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多