Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed #11100 - Added get_comment_permalink template tag to comments a…

…pp to be able to customize the anchor pattern of a comment from the template. Thanks to Idan Gazit for the patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@12080 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit abcf997713fe87a68c8ce7035c9e9dc2266145ea 1 parent 936c99b
@jezdez jezdez authored
View
15 django/contrib/comments/templatetags/comments.py
@@ -252,8 +252,23 @@ def comment_form_target():
"""
return comments.get_form_target()
+#@register.simple_tag
+def get_comment_permalink(comment, anchor_pattern=None):
+ """
+ Get the permalink for a comment, optionally specifying the format of the
+ named anchor to be appended to the end of the URL.
+
+ Example::
+ {{ get_comment_permalink comment "#c%(id)s-by-%(user_name)s" }}
+ """
+
+ if anchor_pattern:
+ return comment.get_absolute_url(anchor_pattern)
+ return comment.get_absolute_url()
+
register.tag(get_comment_count)
register.tag(get_comment_list)
register.tag(get_comment_form)
register.tag(render_comment_form)
register.simple_tag(comment_form_target)
+register.simple_tag(get_comment_permalink)
View
38 docs/ref/contrib/comments/index.txt
@@ -104,6 +104,44 @@ This returns a list of :class:`~django.contrib.comments.models.Comment` objects;
see :ref:`the comment model documentation <ref-contrib-comments-models>` for
details.
+.. templatetag:: get_comment_permalink
+
+Linking to comments
+-------------------
+
+To provide a permalink to a specific comment, use :ttag:`get_comment_permalink`::
+
+ {% get_comment_permalink comment_obj [format_string] %}
+
+By default, the named anchor that will be appended to the URL will be the letter
+'c' followed by the comment id, for example 'c82'. You may specify a custom
+format string if you wish to override this behavior::
+
+ {% get_comment_permalink comment "#c%(id)s-by-%(user_name)s"%}
+
+The format string is a standard python format string. Valid mapping keys
+include any attributes of the comment object.
+
+Regardless of whether you specify a custom anchor pattern, you must supply a
+matching named anchor at a suitable place in your template.
+
+For example::
+
+ {% for comment in comment_list %}
+ <a name="c{{ comment.id }}"></a>
+ <a href="{% get_comment_permalink comment %}">
+ permalink for comment #{{ forloop.counter }}
+ </a>
+ ...
+ {% endfor %}
+
+.. warning::
+
+ There's a known bug in Safari/Webkit which causes the named anchor to be
+ forgotten following a redirect. The practical impact for comments is that
+ the Safari/webkit browsers will arrive at the correct page but will not
+ scroll to the named anchor.
+
.. templatetag:: get_comment_count
Counting comments
View
21 tests/regressiontests/comment_tests/tests/templatetag_tests.py
@@ -1,5 +1,6 @@
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
from regressiontests.comment_tests.tests import CommentTestCase
@@ -63,3 +64,23 @@ def testGetCommentListFromLiteral(self):
def testGetCommentListFromObject(self):
self.testGetCommentList("{% get_comment_list for a as cl %}")
+
+ def testGetCommentPermalink(self):
+ self.createSomeComments()
+ t = "{% load comments %}{% get_comment_list for comment_tests.author author.id as cl %}"
+ t += "{% get_comment_permalink cl.0 %}"
+ ct = ContentType.objects.get_for_model(Author)
+ author = Author.objects.get(pk=1)
+ ctx, out = self.render(t, author=author)
+ self.assertEqual(out, "/cr/%s/%s/#c2" % (ct.id, author.id))
+
+ def testGetCommentPermalinkFormatted(self):
+ self.createSomeComments()
+ t = "{% load comments %}{% get_comment_list for comment_tests.author author.id as cl %}"
+ t += "{% get_comment_permalink cl.0 '#c%(id)s-by-%(user_name)s' %}"
+ ct = ContentType.objects.get_for_model(Author)
+ author = Author.objects.get(pk=1)
+ ctx, out = self.render(t, author=author)
+ self.assertEqual(out, "/cr/%s/%s/#c2-by-Joe Somebody" % (ct.id, author.id))
+
+
Please sign in to comment.
Something went wrong with that request. Please try again.