I have the following block in my DetailView
def get_object(self):
post = get_object_or_404(
Post.objects \
.select_related('author') \
.prefetch_related('comments'), \
slug=self.kwargs['post_slug'])
if post.status == Post.PUBLIC:
return post
elif post.author == self.request.user:
return post
else:
raise Http404
This works as expected. But how do I test this? When I tried the following test case. It raises Http404
exception but then causes further exception for NoReverseMatch
.
test code:
def test_private_post_detail_as_anonymous(self):
"""
Show 404 for anonymous users who visit private post.
"""
self.client.logout()
print(self.post2.slug) # This works! Prints '1v2ygm-test-post-2'
response = self.client.get(
reverse('posts:post-detail',
kwargs={'post_slug': self.post2.slug}),
follow=True) # Fails here, saying post_slug is ''. Why?
self.assertEqual(response.status_code, 404)
Here is the full traceback:
.....Internal Server Error: /posts/1v2ygm-test-post-2/
E
Traceback (most recent call last):
File "myproject\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "myproject\venv\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "myproject\venv\lib\site-packages\django\views\generic\base.py", line 73, in view
return self.dispatch(request, *args, **kwargs)
File "myproject\venv\lib\site-packages\django\views\generic\base.py", line 101, in dispatch
return handler(request, *args, **kwargs)
File "myproject\venv\lib\site-packages\django\views\generic\detail.py", line 106, in get
self.object = self.get_object()
File "myproject\myproject\posts\views.py", line 75, in get_object
raise Http404
django.http.response.Http404
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "myproject\myproject\posts\tests\test_views.py", line 263, in test_private_post_detail_as_anonymous
response = self.client.get(
File "myproject\venv\lib\site-packages\django\test\client.py", line 732, in get
response = super().get(path, data=data, secure=secure, **extra)
File "myproject\venv\lib\site-packages\django\test\client.py", line 393, in get
return self.generic('GET', path, secure=secure, **{
File "myproject\venv\lib\site-packages\django\test\client.py", line 470, in generic
return self.request(**r)
File "myproject\venv\lib\site-packages\django\test\client.py", line 709, in request
self.check_exception(response)
File "myproject\venv\lib\site-packages\django\test\client.py", line 571, in check_exception
raise exc_value
File "myproject\venv\lib\site-packages\django\core\handlers\exception.py", line 121, in get_exception_response
response = callback(request, **{**param_dict, 'exception': exception})
File "myproject\venv\lib\site-packages\django\utils\decorators.py", line 130, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "myproject\venv\lib\site-packages\django\views\defaults.py", line 60, in page_not_found
body = template.render(context, request)
File "myproject\venv\lib\site-packages\django\template\backends\django.py", line 61, in render
return self.template.render(context)
File "myproject\venv\lib\site-packages\django\template\base.py", line 170, in render
return self._render(context)
File "myproject\venv\lib\site-packages\django\test\utils.py", line 96, in instrumented_test_render
return self.nodelist.render(context)
File "myproject\venv\lib\site-packages\django\template\base.py", line 938, in render
bit = node.render_annotated(context)
File "myproject\venv\lib\site-packages\django\template\base.py", line 905, in render_annotated
return self.render(context)
File "myproject\venv\lib\site-packages\django\template\loader_tags.py", line 150, in render
return compiled_parent._render(context)
File "myproject\venv\lib\site-packages\django\test\utils.py", line 96, in instrumented_test_render
return self.nodelist.render(context)
File "myproject\venv\lib\site-packages\django\template\base.py", line 938, in render
bit = node.render_annotated(context)
File "myproject\venv\lib\site-packages\django\template\base.py", line 905, in render_annotated
return self.render(context)
File "myproject\venv\lib\site-packages\django\template\loader_tags.py", line 192, in render
return template.render(context)
File "myproject\venv\lib\site-packages\django\template\base.py", line 172, in render
return self._render(context)
File "myproject\venv\lib\site-packages\django\test\utils.py", line 96, in instrumented_test_render
return self.nodelist.render(context)
File "myproject\venv\lib\site-packages\django\template\base.py", line 938, in render
bit = node.render_annotated(context)
File "myproject\venv\lib\site-packages\django\template\base.py", line 905, in render_annotated
return self.render(context)
File "myproject\venv\lib\site-packages\django\template\loader_tags.py", line 192, in render
return template.render(context)
File "myproject\venv\lib\site-packages\django\template\base.py", line 172, in render
return self._render(context)
File "myproject\venv\lib\site-packages\django\test\utils.py", line 96, in instrumented_test_render
return self.nodelist.render(context)
File "myproject\venv\lib\site-packages\django\template\base.py", line 938, in render
bit = node.render_annotated(context)
File "myproject\venv\lib\site-packages\django\template\base.py", line 905, in render_annotated
return self.render(context)
File "myproject\venv\lib\site-packages\django\template\defaulttags.py", line 312, in render
return nodelist.render(context)
File "myproject\venv\lib\site-packages\django\template\base.py", line 938, in render
bit = node.render_annotated(context)
File "myproject\venv\lib\site-packages\django\template\base.py", line 905, in render_annotated
return self.render(context)
File "myproject\venv\lib\site-packages\django\template\defaulttags.py", line 446, in render
url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
File "myproject\venv\lib\site-packages\django\urls\base.py", line 87, in reverse
return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
File "myproject\venv\lib\site-packages\django\urls\resolvers.py", line 685, in _reverse_with_prefix
raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for 'post-detail' with keyword arguments '{'post_slug': ''}' not found. 1 pattern(s) tried: ['posts/(?P<post_slug>[-a-zA-Z0-9_]+)/$']
Why post_slug
is empty?