소스 검색

Fixed #15904 - render_comment_form executes unnecessary query for object

Thanks to stefanw for report and patch!

git-svn-id: http://code.djangoproject.com/svn/django/trunk@16103 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Luke Plant 14 년 전
부모
커밋
1b6670dd59
2개의 변경된 파일19개의 추가작업 그리고 3개의 파일을 삭제
  1. 14 3
      django/contrib/comments/templatetags/comments.py
  2. 5 0
      tests/regressiontests/comment_tests/tests/templatetag_tests.py

+ 14 - 3
django/contrib/comments/templatetags/comments.py

@@ -122,12 +122,23 @@ class CommentFormNode(BaseCommentNode):
     """Insert a form for the comment model into the context."""
 
     def get_form(self, context):
-        ctype, object_pk = self.get_target_ctype_pk(context)
-        if object_pk:
-            return comments.get_form()(ctype.get_object_for_this_type(pk=object_pk))
+        obj = self.get_object(context)
+        if obj:
+            return comments.get_form()(obj)
         else:
             return None
 
+    def get_object(self, context):
+        if self.object_expr:
+            try:
+                return self.object_expr.resolve(context)
+            except template.VariableDoesNotExist:
+                return None
+        else:
+            object_pk = self.object_pk_expr.resolve(context,
+                    ignore_failures=True)
+            return self.ctype.get_object_for_this_type(pk=object_pk)
+
     def render(self, context):
         context[self.as_varname] = self.get_form(context)
         return ''

+ 5 - 0
tests/regressiontests/comment_tests/tests/templatetag_tests.py

@@ -40,6 +40,11 @@ class CommentTemplateTagTests(CommentTestCase):
     def testRenderCommentFormFromObject(self):
         self.testRenderCommentForm("{% render_comment_form for a %}")
 
+    def testRenderCommentFormFromObjectWithQueryCount(self):
+        def test():
+            self.testRenderCommentFormFromObject()
+        self.assertNumQueries(1, test)
+
     def testGetCommentCount(self, tag=None):
         self.createSomeComments()
         t = "{% load comments %}" + (tag or "{% get_comment_count for comment_tests.article a.id as cc %}") + "{{ cc }}"