123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- ===========================
- Django's comments framework
- ===========================
- .. module:: django.contrib.comments
- :synopsis: Django's comment framework
- .. highlightlang:: html+django
- Django includes a simple, yet customizable comments framework. The built-in
- comments framework can be used to attach comments to any model, so you can use
- it for comments on blog entries, photos, book chapters, or anything else.
- .. note::
- If you used to use Django's older (undocumented) comments framework, you'll
- need to upgrade. See the :doc:`upgrade guide </ref/contrib/comments/upgrade>`
- for instructions.
- Quick start guide
- =================
- To get started using the ``comments`` app, follow these steps:
- #. Install the comments framework by adding ``'django.contrib.comments'`` to
- :setting:`INSTALLED_APPS`.
- #. Run ``manage.py syncdb`` so that Django will create the comment tables.
- #. Add the comment app's URLs to your project's ``urls.py``:
- .. code-block:: python
- urlpatterns = patterns('',
- ...
- (r'^comments/', include('django.contrib.comments.urls')),
- ...
- )
- #. Use the `comment template tags`_ below to embed comments in your
- templates.
- You might also want to examine :doc:`/ref/contrib/comments/settings`.
- Comment template tags
- =====================
- You'll primarily interact with the comment system through a series of template
- tags that let you embed comments and generate forms for your users to post them.
- Like all custom template tag libraries, you'll need to :ref:`load the custom
- tags <loading-custom-template-libraries>` before you can use them::
- {% load comments %}
- Once loaded you can use the template tags below.
- Specifying which object comments are attached to
- ------------------------------------------------
- Django's comments are all "attached" to some parent object. This can be any
- instance of a Django model. Each of the tags below gives you a couple of
- different ways you can specify which object to attach to:
- #. Refer to the object directly -- the more common method. Most of the
- time, you'll have some object in the template's context you want
- to attach the comment to; you can simply use that object.
- For example, in a blog entry page that has a variable named ``entry``,
- you could use the following to load the number of comments::
- {% get_comment_count for entry as comment_count %}.
- #. Refer to the object by content-type and object id. You'd use this method
- if you, for some reason, don't actually have direct access to the object.
- Following the above example, if you knew the object ID was ``14`` but
- didn't have access to the actual object, you could do something like::
- {% get_comment_count for blog.entry 14 as comment_count %}
- In the above, ``blog.entry`` is the app label and (lower-cased) model
- name of the model class.
- Displaying comments
- -------------------
- To display a list of comments, you can use the template tags
- :ttag:`render_comment_list` or :ttag:`get_comment_list`.
- .. templatetag:: render_comment_list
- Quickly rendering a comment list
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- The easiest way to display a list of comments for some object is by using
- :ttag:`render_comment_list`::
- {% render_comment_list for [object] %}
- For example::
- {% render_comment_list for event %}
- This will render comments using a template named ``comments/list.html``, a
- default version of which is included with Django.
- .. templatetag:: get_comment_list
- Rendering a custom comment list
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- To get the list of comments for some object, use :ttag:`get_comment_list`::
- {% get_comment_list for [object] as [varname] %}
- For example::
- {% get_comment_list for event as comment_list %}
- {% for comment in comment_list %}
- ...
- {% endfor %}
- This returns a list of :class:`~django.contrib.comments.models.Comment` objects;
- see :doc:`the comment model documentation </ref/contrib/comments/models>` for
- details.
- .. templatetag:: get_comment_permalink
- Linking to comments
- -------------------
- .. versionadded:: 1.2
- 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
- -----------------
- To count comments attached to an object, use :ttag:`get_comment_count`::
- {% get_comment_count for [object] as [varname] %}
- For example::
- {% get_comment_count for event as comment_count %}
- <p>This event has {{ comment_count }} comments.</p>
- Displaying the comment post form
- --------------------------------
- To show the form that users will use to post a comment, you can use
- :ttag:`render_comment_form` or :ttag:`get_comment_form`
- .. templatetag:: render_comment_form
- Quickly rendering the comment form
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- The easiest way to display a comment form is by using
- :ttag:`render_comment_form`::
- {% render_comment_form for [object] %}
- For example::
- {% render_comment_form for event %}
- This will render comments using a template named ``comments/form.html``, a
- default version of which is included with Django.
- .. templatetag:: get_comment_form
- Rendering a custom comment form
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- If you want more control over the look and feel of the comment form, you use use
- :ttag:`get_comment_form` to get a :doc:`form object </topics/forms/index>` that
- you can use in the template::
- {% get_comment_form for [object] as [varname] %}
- A complete form might look like::
- {% get_comment_form for event as form %}
- <table>
- <form action="{% comment_form_target %}" method="post">
- {% csrf_token %}
- {{ form }}
- <tr>
- <td colspan="2">
- <input type="submit" name="submit" value="Post">
- <input type="submit" name="preview" value="Preview">
- </td>
- </tr>
- </form>
- </table>
- Be sure to read the `notes on the comment form`_, below, for some special
- considerations you'll need to make if you're using this approach.
- .. templatetag:: comment_form_target
- Getting the comment form target
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- You may have noticed that the above example uses another template tag --
- :ttag:`comment_form_target` -- to actually get the ``action`` attribute of the
- form. This will always return the correct URL that comments should be posted to;
- you'll always want to use it like above::
- <form action="{% comment_form_target %}" method="post">
- Redirecting after the comment post
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- To specify the URL you want to redirect to after the comment has been posted,
- you can include a hidden form input called ``next`` in your comment form. For example::
- <input type="hidden" name="next" value="{% url my_comment_was_posted %}" />
- .. _notes-on-the-comment-form:
- Notes on the comment form
- -------------------------
- The form used by the comment system has a few important anti-spam attributes you
- should know about:
- * It contains a number of hidden fields that contain timestamps, information
- about the object the comment should be attached to, and a "security hash"
- used to validate this information. If someone tampers with this data --
- something comment spammers will try -- the comment submission will fail.
- If you're rendering a custom comment form, you'll need to make sure to
- pass these values through unchanged.
- * The timestamp is used to ensure that "reply attacks" can't continue very
- long. Users who wait too long between requesting the form and posting a
- comment will have their submissions refused.
- * The comment form includes a "honeypot_" field. It's a trap: if any data is
- entered in that field, the comment will be considered spam (spammers often
- automatically fill in all fields in an attempt to make valid submissions).
- The default form hides this field with a piece of CSS and further labels
- it with a warning field; if you use the comment form with a custom
- template you should be sure to do the same.
- The comments app also depends on the more general :doc:`Cross Site Request
- Forgery protection </ref/contrib/csrf>` that comes with Django. As described in
- the documentation, it is best to use ``CsrfViewMiddleware``. However, if you
- are not using that, you will need to use the ``csrf_protect`` decorator on any
- views that include the comment form, in order for those views to be able to
- output the CSRF token and cookie.
- .. _honeypot: http://en.wikipedia.org/wiki/Honeypot_(computing)
- More information
- ================
- .. toctree::
- :maxdepth: 1
- models
- settings
- signals
- upgrade
- custom
- forms
- moderation
- example
|