Skip to content


Repository files navigation

Pinax Comments

CircleCi Codecov

Table of Contents

About Pinax

Pinax is an open-source platform built on the Django Web Framework. It is an ecosystem of reusable Django apps, themes, and starter project templates. This collection can be found at

Important Links

Where you can find what you need:



pinax-comments is a comments app for Django.

Supported Django and Python Versions

Django / Python 3.6 3.7 3.8
2.2 * * *
3.0 * * *



To install pinax-comments:

    $ pip install pinax-comments

Add pinax.comments to your INSTALLED_APPS setting:

        # other apps

Add pinax.comments.urls to your project urlpatterns:

    urlpatterns = [
        # other urls
        url(r"^comments/", include("pinax.comments.urls", namespace="pinax_comments"))


Common usage involves wiring up template tags as seen in this example, which presents a form for adding a new comment on wall_user, as well as showing existing comments.

Three template tags are used here: comment_target, which returns a URL for posting a comment on wall_user; comment_form, which returns a comment form for wall_user; and comments, which returns all comments on wall_user.

    <div class="list-group">
        <div class="list-group-item">
            {% comment_target wall_user as post_url %}
            {% comment_form wall_user as comment_form %}
            <form class="form" method="post" action="{{ post_url }}">
                {% csrf_token %}
                {{ comment_form|bootstrap }}
                <button class="btn btn-primary">Post Message</button>
        {% comments wall_user as wall_comments %}
        {% for comment in wall_comments %}
        <div class="list-group-item">
            {{ comment.comment|linebreaks }}
            <div class="meta">
                <small class="text-muted pull-right">{{ comment.submit_date }}</small>
                <small class="text-muted">
                    <a href="{% url "wall" %}">
                        {{ }}
        {% endfor %}

Template Tags


Returns True if user can delete comment.

    {% if comment|can_delete_comment:user %}


Returns True if user can edit comment.

    {% if comment|can_edit_comment:user %}


Returns number of comments on obj.


    {% comment_count obj %}


    {% comment_count obj as var %}


Returns a comment form for obj. Checks context user to determine if the comment should be from an authenticated or anonymous user.


    {% comment_form obj as comment_form %}


Returns the URL for posting a comment on obj

    {% comment_target obj %}


    {% comment_target obj as var %}


Returns iterable of comments on obj as context variable var.

    {% comments obj as var %}


Both signals provide two keyword arguments: comment, the relevant Comment instance, and request.


Sent when a comment is added.


Sent when a comment is updated.

Hookset Methods

load_can_delete(self, user, comment)

Override this method to specify if user can delete comment. By default only comment authors can edit comments.

load_can_edit(self, user, comment)

Override this method to specify if user can edit comment. By default, Django superusers and comment authors can delete comments.

This example overrides default load_can_edit() with a silly alternative:


from pinax.comments.hooks import CommentsDefaultHookSet

class CommentsHookSet(CommentsDefaultHookSet):

    def load_can_edit(self, user, comment):
        return user.username in ["funk", "wagnalls"]



Used to provide your own custom hookset methods, as described above. Value is a dotted path to your own hookset class:

PINAX_COMMENTS_HOOKSET = "myapp.hooks.CommentsHookSet"

Change Log


  • Drop Django 1.11, 2.0, and 2.1, and Python 2,7, 3.4, and 3.5 support
  • Add Django 2.2 and 3.0, and Python 3.6, 3.7, and 3.8 support
  • Update packaging configs
  • Direct users to community resources


  • Remove django-user-accounts from test requirements


  • Replace deprecated render_to_string() context_instance kwarg
  • Add view tests
  • Add templatetag tests


  • add django>=1.11 requirement
  • update testing requirements
  • improve documentation markup
  • remove "static" and "templates" dirs from


  • Add Django 2.0 compatibility testing
  • Drop Django 1.9, 1.9, 1.10 and Python 3.3 support
  • Move documentation into README, standardize documentation layout
  • Convert CI and coverage to CircleCi and CodeCov
  • Add PyPi-compatible long description
  • Add documentation for templatetags and signals
  • Add usage example


  • initial release


Contributing information can be found in the Pinax community health file repo.

Code of Conduct

In order to foster a kind, inclusive, and harassment-free community, the Pinax Project has a Code of Conduct. We ask you to treat everyone as a smart human programmer that shares an interest in Python, Django, and Pinax with you.

Connect with Pinax

For updates and news regarding the Pinax Project, please follow us on Twitter @pinaxproject and check out our Pinax Project blog.


Copyright (c) 2012-present James Tauber and contributors under the MIT license.