Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
270 views
in Technique[技术] by (71.8m points)

python - Django: How to search through django.template.context.RequestContext

I'm working over tests in Django and faced <class 'django.template.context.RequestContext'>, which I'm trying to iterate through and find <class 'ecom.models.Product'> object inside.

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

What's inside 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}
]

]

Type of response.context:

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

What's inside Product.objects.get(id=1) is: Pen

Type of Product.objects.get(id=1) is: <class 'ecom.models.Product'>

I don't undestand why:

  • it found Product object in self.assertEqual(response.context[0]['object'], Product.objects.get(id=1)), but not in self.assertIn(Product.objects.get(id=1), response.context[0]['object']) - says TypeError: argument of type 'Product' is not iterable

  • it also didn't find it in self.assertIn(Product.objects.get(id=1), response.context[0]) - says "AssertionError: <Product: Pen> not found in [....here goes contents of response.context[0]....]"

  • it also didn't find it in self.assertIn(Product.objects.get(id=1), response.context[0][3]) - says "in getitem raise KeyError(key), KeyError: 3"

  • how to work with RequestContext class? JSON like?

Sorry for a bit mixed up question, just trying to understand how to work with RequestContext. Thank you in advance!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

I think your test is failing because assertIn looks through the KEYS not the values. Solution would be:

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

A little more explanation: response.context[0] seems like it's some key-value storage, i.e. a dict. When you do response.context[0]["object"], you've just accessed the value at the key "object" where response.context[0] is the dict. Doing some in query on the dictionary only looks up the keys of the dictionary.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...