Fixed #11100 - Added get_comment_permalink template tag to comments app 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
This commit is contained in:
Jannis Leidel 2010-01-04 02:28:09 +00:00
parent 936c99b7c7
commit abcf997713
3 changed files with 74 additions and 0 deletions

View File

@ -252,8 +252,23 @@ def comment_form_target():
""" """
return comments.get_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_count)
register.tag(get_comment_list) register.tag(get_comment_list)
register.tag(get_comment_form) register.tag(get_comment_form)
register.tag(render_comment_form) register.tag(render_comment_form)
register.simple_tag(comment_form_target) register.simple_tag(comment_form_target)
register.simple_tag(get_comment_permalink)

View File

@ -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 see :ref:`the comment model documentation <ref-contrib-comments-models>` for
details. 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 .. templatetag:: get_comment_count
Counting comments Counting comments

View File

@ -1,5 +1,6 @@
from django.contrib.comments.forms import CommentForm from django.contrib.comments.forms import CommentForm
from django.contrib.comments.models import Comment from django.contrib.comments.models import Comment
from django.contrib.contenttypes.models import ContentType
from django.template import Template, Context from django.template import Template, Context
from regressiontests.comment_tests.models import Article, Author from regressiontests.comment_tests.models import Article, Author
from regressiontests.comment_tests.tests import CommentTestCase from regressiontests.comment_tests.tests import CommentTestCase
@ -63,3 +64,23 @@ class CommentTemplateTagTests(CommentTestCase):
def testGetCommentListFromObject(self): def testGetCommentListFromObject(self):
self.testGetCommentList("{% get_comment_list for a as cl %}") 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))