diff --git a/django/contrib/comments/templatetags/comments.py b/django/contrib/comments/templatetags/comments.py index 024c4f658e..ce1825e529 100644 --- a/django/contrib/comments/templatetags/comments.py +++ b/django/contrib/comments/templatetags/comments.py @@ -47,7 +47,7 @@ class BaseCommentNode(template.Node): def lookup_content_type(token, tagname): try: app, model = token.split('.') - return ContentType.objects.get(app_label=app, model=model) + return ContentType.objects.get_by_natural_key(app, model) except ValueError: raise template.TemplateSyntaxError("Third argument in %r must be in the format 'app.model'" % tagname) except ContentType.DoesNotExist: diff --git a/tests/regressiontests/comment_tests/tests/templatetag_tests.py b/tests/regressiontests/comment_tests/tests/templatetag_tests.py index 0ee34ac670..99c3ca37fa 100644 --- a/tests/regressiontests/comment_tests/tests/templatetag_tests.py +++ b/tests/regressiontests/comment_tests/tests/templatetag_tests.py @@ -1,4 +1,7 @@ +from __future__ import with_statement + from django.contrib.comments.forms import CommentForm +from django.contrib.comments.models import Comment from django.contrib.contenttypes.models import ContentType from django.template import Template, Context from regressiontests.comment_tests.models import Article, Author @@ -44,30 +47,41 @@ class CommentTemplateTagTests(CommentTestCase): self.testRenderCommentFormFromObject() self.assertNumQueries(1, test) - def testGetCommentCount(self, tag=None): - self.createSomeComments() + def verifyGetCommentCount(self, tag=None): t = "{% load comments %}" + (tag or "{% get_comment_count for comment_tests.article a.id as cc %}") + "{{ cc }}" ctx, out = self.render(t, a=Article.objects.get(pk=1)) self.assertEqual(out, "2") + def testGetCommentCount(self): + self.createSomeComments() + self.verifyGetCommentCount("{% get_comment_count for comment_tests.article a.id as cc %}") + def testGetCommentCountFromLiteral(self): - self.testGetCommentCount("{% get_comment_count for comment_tests.article 1 as cc %}") + self.createSomeComments() + self.verifyGetCommentCount("{% get_comment_count for comment_tests.article 1 as cc %}") def testGetCommentCountFromObject(self): - self.testGetCommentCount("{% get_comment_count for a as cc %}") + self.createSomeComments() + self.verifyGetCommentCount("{% get_comment_count for a as cc %}") - def testGetCommentList(self, tag=None): - c1, c2, c3, c4 = self.createSomeComments() - t = "{% load comments %}" + (tag or "{% get_comment_list for comment_tests.author a.id as cl %}") + def verifyGetCommentList(self, tag=None): + c1, c2, c3, c4 = Comment.objects.all()[:4] + t = "{% load comments %}" + (tag or "{% get_comment_list for comment_tests.author a.id as cl %}") ctx, out = self.render(t, a=Author.objects.get(pk=1)) self.assertEqual(out, "") self.assertEqual(list(ctx["cl"]), [c2]) + def testGetCommentList(self): + self.createSomeComments() + self.verifyGetCommentList("{% get_comment_list for comment_tests.author a.id as cl %}") + def testGetCommentListFromLiteral(self): - self.testGetCommentList("{% get_comment_list for comment_tests.author 1 as cl %}") + self.createSomeComments() + self.verifyGetCommentList("{% get_comment_list for comment_tests.author 1 as cl %}") def testGetCommentListFromObject(self): - self.testGetCommentList("{% get_comment_list for a as cl %}") + self.createSomeComments() + self.verifyGetCommentList("{% get_comment_list for a as cl %}") def testGetCommentPermalink(self): c1, c2, c3, c4 = self.createSomeComments() @@ -99,3 +113,63 @@ class CommentTemplateTagTests(CommentTestCase): def testRenderCommentListFromObject(self): self.testRenderCommentList("{% render_comment_list for a %}") + def testNumberQueries(self): + """ + Ensure that the template tags use cached content types to reduce the + number of DB queries. + Refs #16042. + """ + + self.createSomeComments() + + # {% render_comment_list %} ----------------- + + # Clear CT cache + ContentType.objects.clear_cache() + with self.assertNumQueries(4): + self.testRenderCommentListFromObject() + + # Force the CT to be cached + ct = ContentType.objects.get_for_model(Article) + with self.assertNumQueries(3): + self.testRenderCommentListFromObject() + + # {% get_comment_list %} -------------------- + + ContentType.objects.clear_cache() + with self.assertNumQueries(4): + self.verifyGetCommentList() + + ct = ContentType.objects.get_for_model(Author) + with self.assertNumQueries(3): + self.verifyGetCommentList() + + # {% render_comment_form %} ----------------- + + ContentType.objects.clear_cache() + with self.assertNumQueries(3): + self.testRenderCommentForm() + + ct = ContentType.objects.get_for_model(Article) + with self.assertNumQueries(2): + self.testRenderCommentForm() + + # {% get_comment_form %} -------------------- + + ContentType.objects.clear_cache() + with self.assertNumQueries(3): + self.testGetCommentForm() + + ct = ContentType.objects.get_for_model(Article) + with self.assertNumQueries(2): + self.testGetCommentForm() + + # {% get_comment_count %} ------------------- + + ContentType.objects.clear_cache() + with self.assertNumQueries(3): + self.verifyGetCommentCount() + + ct = ContentType.objects.get_for_model(Article) + with self.assertNumQueries(2): + self.verifyGetCommentCount()