Commit 768c8b8748513a839a973498244a5f8cdb98e2a0

Authored by Jacob Kaplan-Moss
1 parent ad6d5a6f

Sketched out an import of the docs.

1 *.pyc 1 *.pyc
2 *.egg-info 2 *.egg-info
  3 +.tox/
  1 +language: python
  2 +python:
  3 + - "2.6"
  4 + - "2.7"
  5 + - "3.2"
  6 + - "3.3"
  7 +env:
  8 + - DJANGO_PACKAGE="Django>=1.5,<1.6"
  9 + - DJANGO_PACKAGE=git+git://github.com/django/django.git
  10 +install: pip install $DJANGO_PACKAGE --use-mirrors
  11 +script: python setup.py test
  1 +# Makefile for Sphinx documentation
  2 +#
  3 +
  4 +# You can set these variables from the command line.
  5 +SPHINXOPTS =
  6 +SPHINXBUILD = sphinx-build
  7 +PAPER =
  8 +BUILDDIR = _build
  9 +
  10 +# Internal variables.
  11 +PAPEROPT_a4 = -D latex_paper_size=a4
  12 +PAPEROPT_letter = -D latex_paper_size=letter
  13 +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
  14 +# the i18n builder cannot share the environment and doctrees with the others
  15 +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
  16 +
  17 +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
  18 +
  19 +help:
  20 + @echo "Please use \`make <target>' where <target> is one of"
  21 + @echo " html to make standalone HTML files"
  22 + @echo " dirhtml to make HTML files named index.html in directories"
  23 + @echo " singlehtml to make a single large HTML file"
  24 + @echo " pickle to make pickle files"
  25 + @echo " json to make JSON files"
  26 + @echo " htmlhelp to make HTML files and a HTML help project"
  27 + @echo " qthelp to make HTML files and a qthelp project"
  28 + @echo " devhelp to make HTML files and a Devhelp project"
  29 + @echo " epub to make an epub"
  30 + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
  31 + @echo " latexpdf to make LaTeX files and run them through pdflatex"
  32 + @echo " text to make text files"
  33 + @echo " man to make manual pages"
  34 + @echo " texinfo to make Texinfo files"
  35 + @echo " info to make Texinfo files and run them through makeinfo"
  36 + @echo " gettext to make PO message catalogs"
  37 + @echo " changes to make an overview of all changed/added/deprecated items"
  38 + @echo " linkcheck to check all external links for integrity"
  39 + @echo " doctest to run all doctests embedded in the documentation (if enabled)"
  40 +
  41 +clean:
  42 + -rm -rf $(BUILDDIR)/*
  43 +
  44 +html:
  45 + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
  46 + @echo
  47 + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
  48 +
  49 +dirhtml:
  50 + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
  51 + @echo
  52 + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
  53 +
  54 +singlehtml:
  55 + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
  56 + @echo
  57 + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
  58 +
  59 +pickle:
  60 + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
  61 + @echo
  62 + @echo "Build finished; now you can process the pickle files."
  63 +
  64 +json:
  65 + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
  66 + @echo
  67 + @echo "Build finished; now you can process the JSON files."
  68 +
  69 +htmlhelp:
  70 + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
  71 + @echo
  72 + @echo "Build finished; now you can run HTML Help Workshop with the" \
  73 + ".hhp project file in $(BUILDDIR)/htmlhelp."
  74 +
  75 +qthelp:
  76 + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
  77 + @echo
  78 + @echo "Build finished; now you can run "qcollectiongenerator" with the" \
  79 + ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
  80 + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/DjangoComments.qhcp"
  81 + @echo "To view the help file:"
  82 + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/DjangoComments.qhc"
  83 +
  84 +devhelp:
  85 + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
  86 + @echo
  87 + @echo "Build finished."
  88 + @echo "To view the help file:"
  89 + @echo "# mkdir -p $$HOME/.local/share/devhelp/DjangoComments"
  90 + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/DjangoComments"
  91 + @echo "# devhelp"
  92 +
  93 +epub:
  94 + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
  95 + @echo
  96 + @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
  97 +
  98 +latex:
  99 + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
  100 + @echo
  101 + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
  102 + @echo "Run \`make' in that directory to run these through (pdf)latex" \
  103 + "(use \`make latexpdf' here to do that automatically)."
  104 +
  105 +latexpdf:
  106 + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
  107 + @echo "Running LaTeX files through pdflatex..."
  108 + $(MAKE) -C $(BUILDDIR)/latex all-pdf
  109 + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
  110 +
  111 +text:
  112 + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
  113 + @echo
  114 + @echo "Build finished. The text files are in $(BUILDDIR)/text."
  115 +
  116 +man:
  117 + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
  118 + @echo
  119 + @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
  120 +
  121 +texinfo:
  122 + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
  123 + @echo
  124 + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
  125 + @echo "Run \`make' in that directory to run these through makeinfo" \
  126 + "(use \`make info' here to do that automatically)."
  127 +
  128 +info:
  129 + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
  130 + @echo "Running Texinfo files through makeinfo..."
  131 + make -C $(BUILDDIR)/texinfo info
  132 + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
  133 +
  134 +gettext:
  135 + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
  136 + @echo
  137 + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
  138 +
  139 +changes:
  140 + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
  141 + @echo
  142 + @echo "The overview file is in $(BUILDDIR)/changes."
  143 +
  144 +linkcheck:
  145 + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
  146 + @echo
  147 + @echo "Link check complete; look for any errors in the above output " \
  148 + "or in $(BUILDDIR)/linkcheck/output.txt."
  149 +
  150 +doctest:
  151 + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
  152 + @echo "Testing of doctests in the sources finished, look at the " \
  153 + "results in $(BUILDDIR)/doctest/output.txt."
  1 +# -*- coding: utf-8 -*-
  2 +#
  3 +# Django Comments documentation build configuration file, created by
  4 +# sphinx-quickstart on Mon Mar 11 10:23:49 2013.
  5 +#
  6 +# This file is execfile()d with the current directory set to its containing dir.
  7 +#
  8 +# Note that not all possible configuration values are present in this
  9 +# autogenerated file.
  10 +#
  11 +# All configuration values have a default; values that are commented out
  12 +# serve to show the default.
  13 +
  14 +import sys, os
  15 +
  16 +# If extensions (or modules to document with autodoc) are in another directory,
  17 +# add these directories to sys.path here. If the directory is relative to the
  18 +# documentation root, use os.path.abspath to make it absolute, like shown here.
  19 +#sys.path.insert(0, os.path.abspath('.'))
  20 +
  21 +# -- General configuration -----------------------------------------------------
  22 +
  23 +# If your documentation needs a minimal Sphinx version, state it here.
  24 +#needs_sphinx = '1.0'
  25 +
  26 +# Add any Sphinx extension module names here, as strings. They can be extensions
  27 +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
  28 +extensions = ['sphinx.ext.intersphinx']
  29 +
  30 +# Add any paths that contain templates here, relative to this directory.
  31 +templates_path = ['_templates']
  32 +
  33 +# The suffix of source filenames.
  34 +source_suffix = '.txt'
  35 +
  36 +# The encoding of source files.
  37 +#source_encoding = 'utf-8-sig'
  38 +
  39 +# The master toctree document.
  40 +master_doc = 'newindex'
  41 +
  42 +# General information about the project.
  43 +project = u'Django Comments'
  44 +copyright = u'2013, Django Software Foundation and contributors'
  45 +
  46 +# The version info for the project you're documenting, acts as replacement for
  47 +# |version| and |release|, also used in various other places throughout the
  48 +# built documents.
  49 +#
  50 +# The short X.Y version.
  51 +version = '1.5'
  52 +# The full version, including alpha/beta/rc tags.
  53 +release = '1.5'
  54 +
  55 +# The language for content autogenerated by Sphinx. Refer to documentation
  56 +# for a list of supported languages.
  57 +#language = None
  58 +
  59 +# There are two options for replacing |today|: either, you set today to some
  60 +# non-false value, then it is used:
  61 +#today = ''
  62 +# Else, today_fmt is used as the format for a strftime call.
  63 +#today_fmt = '%B %d, %Y'
  64 +
  65 +# List of patterns, relative to source directory, that match files and
  66 +# directories to ignore when looking for source files.
  67 +exclude_patterns = ['_build']
  68 +
  69 +# The reST default role (used for this markup: `text`) to use for all documents.
  70 +#default_role = None
  71 +
  72 +# If true, '()' will be appended to :func: etc. cross-reference text.
  73 +#add_function_parentheses = True
  74 +
  75 +# If true, the current module name will be prepended to all description
  76 +# unit titles (such as .. function::).
  77 +#add_module_names = True
  78 +
  79 +# If true, sectionauthor and moduleauthor directives will be shown in the
  80 +# output. They are ignored by default.
  81 +#show_authors = False
  82 +
  83 +# The name of the Pygments (syntax highlighting) style to use.
  84 +pygments_style = 'sphinx'
  85 +
  86 +# A list of ignored prefixes for module index sorting.
  87 +#modindex_common_prefix = []
  88 +
  89 +
  90 +# -- Options for HTML output ---------------------------------------------------
  91 +
  92 +# The theme to use for HTML and HTML Help pages. See the documentation for
  93 +# a list of builtin themes.
  94 +html_theme = 'default'
  95 +
  96 +# Theme options are theme-specific and customize the look and feel of a theme
  97 +# further. For a list of options available for each theme, see the
  98 +# documentation.
  99 +#html_theme_options = {}
  100 +
  101 +# Add any paths that contain custom themes here, relative to this directory.
  102 +#html_theme_path = []
  103 +
  104 +# The name for this set of Sphinx documents. If None, it defaults to
  105 +# "<project> v<release> documentation".
  106 +#html_title = None
  107 +
  108 +# A shorter title for the navigation bar. Default is the same as html_title.
  109 +#html_short_title = None
  110 +
  111 +# The name of an image file (relative to this directory) to place at the top
  112 +# of the sidebar.
  113 +#html_logo = None
  114 +
  115 +# The name of an image file (within the static path) to use as favicon of the
  116 +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
  117 +# pixels large.
  118 +#html_favicon = None
  119 +
  120 +# Add any paths that contain custom static files (such as style sheets) here,
  121 +# relative to this directory. They are copied after the builtin static files,
  122 +# so a file named "default.css" will overwrite the builtin "default.css".
  123 +html_static_path = ['_static']
  124 +
  125 +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
  126 +# using the given strftime format.
  127 +#html_last_updated_fmt = '%b %d, %Y'
  128 +
  129 +# If true, SmartyPants will be used to convert quotes and dashes to
  130 +# typographically correct entities.
  131 +#html_use_smartypants = True
  132 +
  133 +# Custom sidebar templates, maps document names to template names.
  134 +#html_sidebars = {}
  135 +
  136 +# Additional templates that should be rendered to pages, maps page names to
  137 +# template names.
  138 +#html_additional_pages = {}
  139 +
  140 +# If false, no module index is generated.
  141 +#html_domain_indices = True
  142 +
  143 +# If false, no index is generated.
  144 +#html_use_index = True
  145 +
  146 +# If true, the index is split into individual pages for each letter.
  147 +#html_split_index = False
  148 +
  149 +# If true, links to the reST sources are added to the pages.
  150 +#html_show_sourcelink = True
  151 +
  152 +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
  153 +#html_show_sphinx = True
  154 +
  155 +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
  156 +#html_show_copyright = True
  157 +
  158 +# If true, an OpenSearch description file will be output, and all pages will
  159 +# contain a <link> tag referring to it. The value of this option must be the
  160 +# base URL from which the finished HTML is served.
  161 +#html_use_opensearch = ''
  162 +
  163 +# This is the file name suffix for HTML files (e.g. ".xhtml").
  164 +#html_file_suffix = None
  165 +
  166 +# Output file base name for HTML help builder.
  167 +htmlhelp_basename = 'DjangoCommentsdoc'
  168 +
  169 +
  170 +# -- Options for LaTeX output --------------------------------------------------
  171 +
  172 +latex_elements = {
  173 +# The paper size ('letterpaper' or 'a4paper').
  174 +#'papersize': 'letterpaper',
  175 +
  176 +# The font size ('10pt', '11pt' or '12pt').
  177 +#'pointsize': '10pt',
  178 +
  179 +# Additional stuff for the LaTeX preamble.
  180 +#'preamble': '',
  181 +}
  182 +
  183 +# Grouping the document tree into LaTeX files. List of tuples
  184 +# (source start file, target name, title, author, documentclass [howto/manual]).
  185 +latex_documents = [
  186 + ('newindex', 'DjangoComments.tex', u'Django Comments Documentation',
  187 + u'Django Software Foundation and contributors', 'manual'),
  188 +]
  189 +
  190 +# The name of an image file (relative to this directory) to place at the top of
  191 +# the title page.
  192 +#latex_logo = None
  193 +
  194 +# For "manual" documents, if this is true, then toplevel headings are parts,
  195 +# not chapters.
  196 +#latex_use_parts = False
  197 +
  198 +# If true, show page references after internal links.
  199 +#latex_show_pagerefs = False
  200 +
  201 +# If true, show URL addresses after external links.
  202 +#latex_show_urls = False
  203 +
  204 +# Documents to append as an appendix to all manuals.
  205 +#latex_appendices = []
  206 +
  207 +# If false, no module index is generated.
  208 +#latex_domain_indices = True
  209 +
  210 +
  211 +# -- Options for manual page output --------------------------------------------
  212 +
  213 +# One entry per manual page. List of tuples
  214 +# (source start file, name, description, authors, manual section).
  215 +man_pages = [
  216 + ('newindex', 'djangocomments', u'Django Comments Documentation',
  217 + [u'Django Software Foundation and contributors'], 1)
  218 +]
  219 +
  220 +# If true, show URL addresses after external links.
  221 +#man_show_urls = False
  222 +
  223 +
  224 +# -- Options for Texinfo output ------------------------------------------------
  225 +
  226 +# Grouping the document tree into Texinfo files. List of tuples
  227 +# (source start file, target name, title, author,
  228 +# dir menu entry, description, category)
  229 +texinfo_documents = [
  230 + ('newindex', 'DjangoComments', u'Django Comments Documentation',
  231 + u'Django Software Foundation and contributors', 'DjangoComments', 'One line description of project.',
  232 + 'Miscellaneous'),
  233 +]
  234 +
  235 +# Documents to append as an appendix to all manuals.
  236 +#texinfo_appendices = []
  237 +
  238 +# If false, no module index is generated.
  239 +#texinfo_domain_indices = True
  240 +
  241 +# How to display URL addresses: 'footnote', 'no', or 'inline'.
  242 +#texinfo_show_urls = 'footnote'
  243 +
  244 +
  245 +# -- Options for Epub output ---------------------------------------------------
  246 +
  247 +# Bibliographic Dublin Core info.
  248 +epub_title = u'Django Comments'
  249 +epub_author = u'Django Software Foundation and contributors'
  250 +epub_publisher = u'Django Software Foundation and contributors'
  251 +epub_copyright = u'2013, Django Software Foundation and contributors'
  252 +
  253 +# The language of the text. It defaults to the language option
  254 +# or en if the language is not set.
  255 +#epub_language = ''
  256 +
  257 +# The scheme of the identifier. Typical schemes are ISBN or URL.
  258 +#epub_scheme = ''
  259 +
  260 +# The unique identifier of the text. This can be a ISBN number
  261 +# or the project homepage.
  262 +#epub_identifier = ''
  263 +
  264 +# A unique identification for the text.
  265 +#epub_uid = ''
  266 +
  267 +# A tuple containing the cover image and cover page html template filenames.
  268 +#epub_cover = ()
  269 +
  270 +# HTML files that should be inserted before the pages created by sphinx.
  271 +# The format is a list of tuples containing the path and title.
  272 +#epub_pre_files = []
  273 +
  274 +# HTML files shat should be inserted after the pages created by sphinx.
  275 +# The format is a list of tuples containing the path and title.
  276 +#epub_post_files = []
  277 +
  278 +# A list of files that should not be packed into the epub file.
  279 +#epub_exclude_files = []
  280 +
  281 +# The depth of the table of contents in toc.ncx.
  282 +#epub_tocdepth = 3
  283 +
  284 +# Allow duplicate toc entries.
  285 +#epub_tocdup = True
  286 +
  287 +
  288 +# Example configuration for intersphinx: refer to the Python standard library.
  289 +intersphinx_mapping = {'http://docs.python.org/': None}
1 =========================== 1 ===========================
2 -Django's comments framework 2 +Django "excontrib" Comments
3 =========================== 3 ===========================
4 4
5 -.. module:: django.contrib.comments  
6 - :synopsis: Django's comment framework 5 +.. module:: django_comments
  6 + :synopsis: The package formerly known as "django.contrib.comments".
7 7
8 .. highlightlang:: html+django 8 .. highlightlang:: html+django
9 9
10 -.. warning:: 10 +Django used to include a comments framework; since Django 1.6 it's been
  11 +separated to a separate project. This is that project.
11 12
12 - Django's comment framework has been deprecated and is no longer supported.  
13 - Most users will be better served with a custom solution, or a hosted  
14 - product like Disqus__. 13 +This framework can be used to attach comments to any model, so you can use it
  14 +for comments on blog entries, photos, book chapters, or anything else.
15 15
16 - The code formerly known as ``django.contrib.comments`` is `still available  
17 - in an external repository`__.  
18 -  
19 - __ https://disqus.com/  
20 - __ https://github.com/django/django-contrib-comments  
21 -  
22 -Django includes a simple, yet customizable comments framework. The built-in  
23 -comments framework can be used to attach comments to any model, so you can use  
24 -it for comments on blog entries, photos, book chapters, or anything else.  
25 -  
26 -Quick start guide  
27 -=================  
28 -  
29 -To get started using the ``comments`` app, follow these steps:  
30 -  
31 -#. Install the comments framework by adding ``'django.contrib.comments'`` to  
32 - :setting:`INSTALLED_APPS`.  
33 -  
34 -#. Run ``manage.py syncdb`` so that Django will create the comment tables.  
35 -  
36 -#. Add the comment app's URLs to your project's ``urls.py``:  
37 -  
38 - .. code-block:: python  
39 -  
40 - urlpatterns = patterns('',  
41 - ...  
42 - (r'^comments/', include('django.contrib.comments.urls')),  
43 - ...  
44 - )  
45 -  
46 -#. Use the `comment template tags`_ below to embed comments in your  
47 - templates.  
48 -  
49 -You might also want to examine :ref:`the available settings  
50 -<settings-comments>`.  
51 -  
52 -Comment template tags  
53 -=====================  
54 -  
55 -You'll primarily interact with the comment system through a series of template  
56 -tags that let you embed comments and generate forms for your users to post them.  
57 -  
58 -Like all custom template tag libraries, you'll need to :ref:`load the custom  
59 -tags <loading-custom-template-libraries>` before you can use them::  
60 -  
61 - {% load comments %}  
62 -  
63 -Once loaded you can use the template tags below.  
64 -  
65 -Specifying which object comments are attached to  
66 -------------------------------------------------  
67 -  
68 -Django's comments are all "attached" to some parent object. This can be any  
69 -instance of a Django model. Each of the tags below gives you a couple of  
70 -different ways you can specify which object to attach to:  
71 -  
72 -#. Refer to the object directly -- the more common method. Most of the  
73 - time, you'll have some object in the template's context you want  
74 - to attach the comment to; you can simply use that object.  
75 -  
76 - For example, in a blog entry page that has a variable named ``entry``,  
77 - you could use the following to load the number of comments::  
78 -  
79 - {% get_comment_count for entry as comment_count %}.  
80 -  
81 -#. Refer to the object by content-type and object id. You'd use this method  
82 - if you, for some reason, don't actually have direct access to the object.  
83 -  
84 - Following the above example, if you knew the object ID was ``14`` but  
85 - didn't have access to the actual object, you could do something like::  
86 -  
87 - {% get_comment_count for blog.entry 14 as comment_count %}  
88 -  
89 - In the above, ``blog.entry`` is the app label and (lower-cased) model  
90 - name of the model class.  
91 -  
92 -Displaying comments  
93 --------------------  
94 -  
95 -To display a list of comments, you can use the template tags  
96 -:ttag:`render_comment_list` or :ttag:`get_comment_list`.  
97 -  
98 -.. templatetag:: render_comment_list  
99 -  
100 -Quickly rendering a comment list  
101 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
102 -  
103 -The easiest way to display a list of comments for some object is by using  
104 -:ttag:`render_comment_list`::  
105 -  
106 - {% render_comment_list for [object] %}  
107 -  
108 -For example::  
109 -  
110 - {% render_comment_list for event %}  
111 -  
112 -This will render comments using a template named ``comments/list.html``, a  
113 -default version of which is included with Django.  
114 -  
115 -.. templatetag:: get_comment_list  
116 -  
117 -Rendering a custom comment list  
118 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
119 -  
120 -To get the list of comments for some object, use :ttag:`get_comment_list`::  
121 -  
122 - {% get_comment_list for [object] as [varname] %}  
123 -  
124 -For example::  
125 -  
126 - {% get_comment_list for event as comment_list %}  
127 - {% for comment in comment_list %}  
128 - ...  
129 - {% endfor %}  
130 -  
131 -This returns a list of :class:`~django.contrib.comments.models.Comment` objects;  
132 -see :doc:`the comment model documentation </ref/contrib/comments/models>` for  
133 -details.  
134 -  
135 -.. templatetag:: get_comment_permalink  
136 -  
137 -Linking to comments  
138 --------------------  
139 -  
140 -To provide a permalink to a specific comment, use :ttag:`get_comment_permalink`::  
141 -  
142 - {% get_comment_permalink comment_obj [format_string] %}  
143 -  
144 -By default, the named anchor that will be appended to the URL will be the letter  
145 -'c' followed by the comment id, for example 'c82'. You may specify a custom  
146 -format string if you wish to override this behavior::  
147 -  
148 - {% get_comment_permalink comment "#c%(id)s-by-%(user_name)s"%}  
149 -  
150 -The format string is a standard python format string. Valid mapping keys  
151 -include any attributes of the comment object.  
152 -  
153 -Regardless of whether you specify a custom anchor pattern, you must supply a  
154 -matching named anchor at a suitable place in your template.  
155 -  
156 -For example::  
157 -  
158 - {% for comment in comment_list %}  
159 - <a name="c{{ comment.id }}"></a>  
160 - <a href="{% get_comment_permalink comment %}">  
161 - permalink for comment #{{ forloop.counter }}  
162 - </a>  
163 - ...  
164 - {% endfor %}  
165 -  
166 -.. warning::  
167 -  
168 - There's a `known bug`_ in Safari/Webkit which causes the named anchor to be  
169 - forgotten following a redirect. The practical impact for comments is that  
170 - the Safari/webkit browsers will arrive at the correct page but will not  
171 - scroll to the named anchor.  
172 -  
173 -.. _`known bug`: https://bugs.webkit.org/show_bug.cgi?id=24175  
174 -  
175 -.. templatetag:: get_comment_count  
176 -  
177 -Counting comments  
178 ------------------  
179 -  
180 -To count comments attached to an object, use :ttag:`get_comment_count`::  
181 -  
182 - {% get_comment_count for [object] as [varname] %}  
183 -  
184 -For example::  
185 -  
186 - {% get_comment_count for event as comment_count %}  
187 -  
188 - <p>This event has {{ comment_count }} comments.</p>  
189 -  
190 -  
191 -Displaying the comment post form  
192 ---------------------------------  
193 -  
194 -To show the form that users will use to post a comment, you can use  
195 -:ttag:`render_comment_form` or :ttag:`get_comment_form`  
196 -  
197 -.. templatetag:: render_comment_form  
198 -  
199 -Quickly rendering the comment form  
200 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
201 -  
202 -The easiest way to display a comment form is by using  
203 -:ttag:`render_comment_form`::  
204 -  
205 - {% render_comment_form for [object] %}  
206 -  
207 -For example::  
208 -  
209 - {% render_comment_form for event %}  
210 -  
211 -This will render comments using a template named ``comments/form.html``, a  
212 -default version of which is included with Django.  
213 -  
214 -.. templatetag:: get_comment_form  
215 -  
216 -Rendering a custom comment form  
217 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
218 -  
219 -If you want more control over the look and feel of the comment form, you may use  
220 -:ttag:`get_comment_form` to get a :doc:`form object </topics/forms/index>` that  
221 -you can use in the template::  
222 -  
223 - {% get_comment_form for [object] as [varname] %}  
224 -  
225 -A complete form might look like::  
226 -  
227 - {% get_comment_form for event as form %}  
228 - <table>  
229 - <form action="{% comment_form_target %}" method="post">  
230 - {% csrf_token %}  
231 - {{ form }}  
232 - <tr>  
233 - <td colspan="2">  
234 - <input type="submit" name="submit" value="Post">  
235 - <input type="submit" name="preview" value="Preview">  
236 - </td>  
237 - </tr>  
238 - </form>  
239 - </table>  
240 -  
241 -Be sure to read the `notes on the comment form`_, below, for some special  
242 -considerations you'll need to make if you're using this approach.  
243 -  
244 -.. templatetag:: comment_form_target  
245 -  
246 -Getting the comment form target  
247 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
248 -  
249 -You may have noticed that the above example uses another template tag --  
250 -:ttag:`comment_form_target` -- to actually get the ``action`` attribute of the  
251 -form. This will always return the correct URL that comments should be posted to;  
252 -you'll always want to use it like above::  
253 -  
254 - <form action="{% comment_form_target %}" method="post">  
255 -  
256 -Redirecting after the comment post  
257 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
258 -  
259 -To specify the URL you want to redirect to after the comment has been posted,  
260 -you can include a hidden form input called ``next`` in your comment form. For example::  
261 -  
262 - <input type="hidden" name="next" value="{% url 'my_comment_was_posted' %}" />  
263 -  
264 -Providing a comment form for authenticated users  
265 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
266 -  
267 -If a user is already authenticated, it makes little sense to display the name,  
268 -email, and URL fields, since these can already be retrieved from their login  
269 -data and profile. In addition, some sites will only accept comments from  
270 -authenticated users.  
271 -  
272 -To provide a comment form for authenticated users, you can manually provide the  
273 -additional fields expected by the Django comments framework. For example,  
274 -assuming comments are attached to the model "object"::  
275 -  
276 - {% if user.is_authenticated %}  
277 - {% get_comment_form for object as form %}  
278 - <form action="{% comment_form_target %}" method="POST">  
279 - {% csrf_token %}  
280 - {{ form.comment }}  
281 - {{ form.honeypot }}  
282 - {{ form.content_type }}  
283 - {{ form.object_pk }}  
284 - {{ form.timestamp }}  
285 - {{ form.security_hash }}  
286 - <input type="hidden" name="next" value="{% url 'object_detail_view' object.id %}" />  
287 - <input type="submit" value="Add comment" id="id_submit" />  
288 - </form>  
289 - {% else %}  
290 - <p>Please <a href="{% url 'auth_login' %}">log in</a> to leave a comment.</p>  
291 - {% endif %}  
292 -  
293 -The honeypot, content_type, object_pk, timestamp, and security_hash fields are  
294 -fields that would have been created automatically if you had simply used  
295 -``{{ form }}`` in your template, and are referred to in `Notes on the comment  
296 -form`_ below.  
297 -  
298 -Note that we do not need to specify the user to be associated with comments  
299 -submitted by authenticated users. This is possible because the :doc:`Built-in  
300 -Comment Models</ref/contrib/comments/models>` that come with Django associate  
301 -comments with authenticated users by default.  
302 -  
303 -In this example, the honeypot field will still be visible to the user; you'll  
304 -need to hide that field in your CSS::  
305 -  
306 - #id_honeypot {  
307 - display: none;  
308 - }  
309 -  
310 -If you want to accept either anonymous or authenticated comments, replace the  
311 -contents of the "else" clause above with a standard comment form and the right  
312 -thing will happen whether a user is logged in or not.  
313 -  
314 -.. _notes-on-the-comment-form:  
315 -  
316 -Notes on the comment form  
317 --------------------------  
318 -  
319 -The form used by the comment system has a few important anti-spam attributes you  
320 -should know about:  
321 -  
322 -* It contains a number of hidden fields that contain timestamps, information  
323 - about the object the comment should be attached to, and a "security hash"  
324 - used to validate this information. If someone tampers with this data --  
325 - something comment spammers will try -- the comment submission will fail.  
326 -  
327 - If you're rendering a custom comment form, you'll need to make sure to  
328 - pass these values through unchanged.  
329 -  
330 -* The timestamp is used to ensure that "reply attacks" can't continue very  
331 - long. Users who wait too long between requesting the form and posting a  
332 - comment will have their submissions refused.  
333 -  
334 -* The comment form includes a "honeypot_" field. It's a trap: if any data is  
335 - entered in that field, the comment will be considered spam (spammers often  
336 - automatically fill in all fields in an attempt to make valid submissions).  
337 -  
338 - The default form hides this field with a piece of CSS and further labels  
339 - it with a warning field; if you use the comment form with a custom  
340 - template you should be sure to do the same.  
341 -  
342 -The comments app also depends on the more general :doc:`Cross Site Request  
343 -Forgery protection </ref/contrib/csrf>` that comes with Django. As described in  
344 -the documentation, it is best to use ``CsrfViewMiddleware``. However, if you  
345 -are not using that, you will need to use the ``csrf_protect`` decorator on any  
346 -views that include the comment form, in order for those views to be able to  
347 -output the CSRF token and cookie.  
348 -  
349 -.. _honeypot: http://en.wikipedia.org/wiki/Honeypot_(computing)  
350 -  
351 -  
352 -Configuration  
353 -=============  
354 -  
355 -See :ref:`comment settings <settings-comments>`.  
356 -  
357 -  
358 -More information 16 +Contents
359 ================ 17 ================
360 18
361 .. toctree:: 19 .. toctree::
362 :maxdepth: 1 20 :maxdepth: 1
363 21
  22 + quickstart
364 models 23 models
365 signals 24 signals
366 custom 25 custom
367 forms 26 forms
368 moderation 27 moderation
369 example 28 example
  29 + settings
  30 + porting
  31 +
  1 +@ECHO OFF
  2 +
  3 +REM Command file for Sphinx documentation
  4 +
  5 +if "%SPHINXBUILD%" == "" (
  6 + set SPHINXBUILD=sphinx-build
  7 +)
  8 +set BUILDDIR=_build
  9 +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
  10 +set I18NSPHINXOPTS=%SPHINXOPTS% .
  11 +if NOT "%PAPER%" == "" (
  12 + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
  13 + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
  14 +)
  15 +
  16 +if "%1" == "" goto help
  17 +
  18 +if "%1" == "help" (
  19 + :help
  20 + echo.Please use `make ^<target^>` where ^<target^> is one of
  21 + echo. html to make standalone HTML files
  22 + echo. dirhtml to make HTML files named index.html in directories
  23 + echo. singlehtml to make a single large HTML file
  24 + echo. pickle to make pickle files
  25 + echo. json to make JSON files
  26 + echo. htmlhelp to make HTML files and a HTML help project
  27 + echo. qthelp to make HTML files and a qthelp project
  28 + echo. devhelp to make HTML files and a Devhelp project
  29 + echo. epub to make an epub
  30 + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
  31 + echo. text to make text files
  32 + echo. man to make manual pages
  33 + echo. texinfo to make Texinfo files
  34 + echo. gettext to make PO message catalogs
  35 + echo. changes to make an overview over all changed/added/deprecated items
  36 + echo. linkcheck to check all external links for integrity
  37 + echo. doctest to run all doctests embedded in the documentation if enabled
  38 + goto end
  39 +)
  40 +
  41 +if "%1" == "clean" (
  42 + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
  43 + del /q /s %BUILDDIR%\*
  44 + goto end
  45 +)
  46 +
  47 +if "%1" == "html" (
  48 + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
  49 + if errorlevel 1 exit /b 1
  50 + echo.
  51 + echo.Build finished. The HTML pages are in %BUILDDIR%/html.
  52 + goto end
  53 +)
  54 +
  55 +if "%1" == "dirhtml" (
  56 + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
  57 + if errorlevel 1 exit /b 1
  58 + echo.
  59 + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
  60 + goto end
  61 +)
  62 +
  63 +if "%1" == "singlehtml" (
  64 + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
  65 + if errorlevel 1 exit /b 1
  66 + echo.
  67 + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
  68 + goto end
  69 +)
  70 +
  71 +if "%1" == "pickle" (
  72 + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
  73 + if errorlevel 1 exit /b 1
  74 + echo.
  75 + echo.Build finished; now you can process the pickle files.
  76 + goto end
  77 +)
  78 +
  79 +if "%1" == "json" (
  80 + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
  81 + if errorlevel 1 exit /b 1
  82 + echo.
  83 + echo.Build finished; now you can process the JSON files.
  84 + goto end
  85 +)
  86 +
  87 +if "%1" == "htmlhelp" (
  88 + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
  89 + if errorlevel 1 exit /b 1
  90 + echo.
  91 + echo.Build finished; now you can run HTML Help Workshop with the ^
  92 +.hhp project file in %BUILDDIR%/htmlhelp.
  93 + goto end
  94 +)
  95 +
  96 +if "%1" == "qthelp" (
  97 + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
  98 + if errorlevel 1 exit /b 1
  99 + echo.
  100 + echo.Build finished; now you can run "qcollectiongenerator" with the ^
  101 +.qhcp project file in %BUILDDIR%/qthelp, like this:
  102 + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\DjangoComments.qhcp
  103 + echo.To view the help file:
  104 + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\DjangoComments.ghc
  105 + goto end
  106 +)
  107 +
  108 +if "%1" == "devhelp" (
  109 + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
  110 + if errorlevel 1 exit /b 1
  111 + echo.
  112 + echo.Build finished.
  113 + goto end
  114 +)
  115 +
  116 +if "%1" == "epub" (
  117 + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
  118 + if errorlevel 1 exit /b 1
  119 + echo.
  120 + echo.Build finished. The epub file is in %BUILDDIR%/epub.
  121 + goto end
  122 +)
  123 +
  124 +if "%1" == "latex" (
  125 + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
  126 + if errorlevel 1 exit /b 1
  127 + echo.
  128 + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
  129 + goto end
  130 +)
  131 +
  132 +if "%1" == "text" (
  133 + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
  134 + if errorlevel 1 exit /b 1
  135 + echo.
  136 + echo.Build finished. The text files are in %BUILDDIR%/text.
  137 + goto end
  138 +)
  139 +
  140 +if "%1" == "man" (
  141 + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
  142 + if errorlevel 1 exit /b 1
  143 + echo.
  144 + echo.Build finished. The manual pages are in %BUILDDIR%/man.
  145 + goto end
  146 +)
  147 +
  148 +if "%1" == "texinfo" (
  149 + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
  150 + if errorlevel 1 exit /b 1
  151 + echo.
  152 + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
  153 + goto end
  154 +)
  155 +
  156 +if "%1" == "gettext" (
  157 + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
  158 + if errorlevel 1 exit /b 1
  159 + echo.
  160 + echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
  161 + goto end
  162 +)
  163 +
  164 +if "%1" == "changes" (
  165 + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
  166 + if errorlevel 1 exit /b 1
  167 + echo.
  168 + echo.The overview file is in %BUILDDIR%/changes.
  169 + goto end
  170 +)
  171 +
  172 +if "%1" == "linkcheck" (
  173 + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
  174 + if errorlevel 1 exit /b 1
  175 + echo.
  176 + echo.Link check complete; look for any errors in the above output ^
  177 +or in %BUILDDIR%/linkcheck/output.txt.
  178 + goto end
  179 +)
  180 +
  181 +if "%1" == "doctest" (
  182 + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
  183 + if errorlevel 1 exit /b 1
  184 + echo.
  185 + echo.Testing of doctests in the sources finished, look at the ^
  186 +results in %BUILDDIR%/doctest/output.txt.
  187 + goto end
  188 +)
  189 +
  190 +:end
  1 +===============================================================
  2 +Porting to ``django_commants`` from ``django.contrib.comments``
  3 +===============================================================
  4 +
  5 +FIXME
  1 +=================
  2 +Quick start guide
  3 +=================
  4 +
  5 +To get started using the ``comments`` app, follow these steps:
  6 +
  7 +#. Install the comments app by running ``pip install django-contrib-comments``.
  8 +
  9 +#. Install the comments framework by adding ``'django_comments'`` to
  10 + :setting:`INSTALLED_APPS`.
  11 +
  12 +#. Run ``manage.py syncdb`` so that Django will create the comment tables.
  13 +
  14 +#. Add the comment app's URLs to your project's ``urls.py``:
  15 +
  16 + .. code-block:: python
  17 +
  18 + urlpatterns = patterns('',
  19 + ...
  20 + (r'^comments/', include('django_comments.urls')),
  21 + ...
  22 + )
  23 +
  24 +#. Use the `comment template tags`_ below to embed comments in your
  25 + templates.
  26 +
  27 +You might also want to examine :ref:`the available settings
  28 +<settings-comments>`.
  29 +
  30 +Comment template tags
  31 +=====================
  32 +
  33 +You'll primarily interact with the comment system through a series of template
  34 +tags that let you embed comments and generate forms for your users to post them.
  35 +
  36 +Like all custom template tag libraries, you'll need to :ref:`load the custom
  37 +tags <loading-custom-template-libraries>` before you can use them::
  38 +
  39 + {% load comments %}
  40 +
  41 +Once loaded you can use the template tags below.
  42 +
  43 +Specifying which object comments are attached to
  44 +------------------------------------------------
  45 +
  46 +Django's comments are all "attached" to some parent object. This can be any
  47 +instance of a Django model. Each of the tags below gives you a couple of
  48 +different ways you can specify which object to attach to:
  49 +
  50 +#. Refer to the object directly -- the more common method. Most of the
  51 + time, you'll have some object in the template's context you want
  52 + to attach the comment to; you can simply use that object.
  53 +
  54 + For example, in a blog entry page that has a variable named ``entry``,
  55 + you could use the following to load the number of comments::
  56 +
  57 + {% get_comment_count for entry as comment_count %}.
  58 +
  59 +#. Refer to the object by content-type and object id. You'd use this method
  60 + if you, for some reason, don't actually have direct access to the object.
  61 +
  62 + Following the above example, if you knew the object ID was ``14`` but
  63 + didn't have access to the actual object, you could do something like::
  64 +
  65 + {% get_comment_count for blog.entry 14 as comment_count %}
  66 +
  67 + In the above, ``blog.entry`` is the app label and (lower-cased) model
  68 + name of the model class.
  69 +
  70 +Displaying comments
  71 +-------------------
  72 +
  73 +To display a list of comments, you can use the template tags
  74 +:ttag:`render_comment_list` or :ttag:`get_comment_list`.
  75 +
  76 +.. templatetag:: render_comment_list
  77 +
  78 +Quickly rendering a comment list
  79 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  80 +
  81 +The easiest way to display a list of comments for some object is by using
  82 +:ttag:`render_comment_list`::
  83 +
  84 + {% render_comment_list for [object] %}
  85 +
  86 +For example::
  87 +
  88 + {% render_comment_list for event %}
  89 +
  90 +This will render comments using a template named ``comments/list.html``, a
  91 +default version of which is included with Django.
  92 +
  93 +.. templatetag:: get_comment_list
  94 +
  95 +Rendering a custom comment list
  96 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  97 +
  98 +To get the list of comments for some object, use :ttag:`get_comment_list`::
  99 +
  100 + {% get_comment_list for [object] as [varname] %}
  101 +
  102 +For example::
  103 +
  104 + {% get_comment_list for event as comment_list %}
  105 + {% for comment in comment_list %}
  106 + ...
  107 + {% endfor %}
  108 +
  109 +This returns a list of :class:`~django.contrib.comments.models.Comment` objects;
  110 +see :doc:`the comment model documentation </ref/contrib/comments/models>` for
  111 +details.
  112 +
  113 +.. templatetag:: get_comment_permalink
  114 +
  115 +Linking to comments
  116 +-------------------
  117 +
  118 +To provide a permalink to a specific comment, use :ttag:`get_comment_permalink`::
  119 +
  120 + {% get_comment_permalink comment_obj [format_string] %}
  121 +
  122 +By default, the named anchor that will be appended to the URL will be the letter
  123 +'c' followed by the comment id, for example 'c82'. You may specify a custom
  124 +format string if you wish to override this behavior::
  125 +
  126 + {% get_comment_permalink comment "#c%(id)s-by-%(user_name)s"%}
  127 +
  128 +The format string is a standard python format string. Valid mapping keys
  129 +include any attributes of the comment object.
  130 +
  131 +Regardless of whether you specify a custom anchor pattern, you must supply a
  132 +matching named anchor at a suitable place in your template.
  133 +
  134 +For example::
  135 +
  136 + {% for comment in comment_list %}
  137 + <a name="c{{ comment.id }}"></a>
  138 + <a href="{% get_comment_permalink comment %}">
  139 + permalink for comment #{{ forloop.counter }}
  140 + </a>
  141 + ...
  142 + {% endfor %}
  143 +
  144 +.. warning::
  145 +
  146 + There's a `known bug`_ in Safari/Webkit which causes the named anchor to be
  147 + forgotten following a redirect. The practical impact for comments is that
  148 + the Safari/webkit browsers will arrive at the correct page but will not
  149 + scroll to the named anchor.
  150 +
  151 +.. _`known bug`: https://bugs.webkit.org/show_bug.cgi?id=24175
  152 +
  153 +.. templatetag:: get_comment_count
  154 +
  155 +Counting comments
  156 +-----------------
  157 +
  158 +To count comments attached to an object, use :ttag:`get_comment_count`::
  159 +
  160 + {% get_comment_count for [object] as [varname] %}
  161 +
  162 +For example::
  163 +
  164 + {% get_comment_count for event as comment_count %}
  165 +
  166 + <p>This event has {{ comment_count }} comments.</p>
  167 +
  168 +
  169 +Displaying the comment post form
  170 +--------------------------------
  171 +
  172 +To show the form that users will use to post a comment, you can use
  173 +:ttag:`render_comment_form` or :ttag:`get_comment_form`
  174 +
  175 +.. templatetag:: render_comment_form
  176 +
  177 +Quickly rendering the comment form
  178 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  179 +
  180 +The easiest way to display a comment form is by using
  181 +:ttag:`render_comment_form`::
  182 +
  183 + {% render_comment_form for [object] %}
  184 +
  185 +For example::
  186 +
  187 + {% render_comment_form for event %}
  188 +
  189 +This will render comments using a template named ``comments/form.html``, a
  190 +default version of which is included with Django.
  191 +
  192 +.. templatetag:: get_comment_form
  193 +
  194 +Rendering a custom comment form
  195 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  196 +
  197 +If you want more control over the look and feel of the comment form, you may use
  198 +:ttag:`get_comment_form` to get a :doc:`form object </topics/forms/index>` that
  199 +you can use in the template::
  200 +
  201 + {% get_comment_form for [object] as [varname] %}
  202 +
  203 +A complete form might look like::
  204 +
  205 + {% get_comment_form for event as form %}
  206 + <table>
  207 + <form action="{% comment_form_target %}" method="post">
  208 + {% csrf_token %}
  209 + {{ form }}
  210 + <tr>
  211 + <td colspan="2">
  212 + <input type="submit" name="submit" value="Post">
  213 + <input type="submit" name="preview" value="Preview">
  214 + </td>
  215 + </tr>
  216 + </form>
  217 + </table>
  218 +
  219 +Be sure to read the `notes on the comment form`_, below, for some special
  220 +considerations you'll need to make if you're using this approach.
  221 +
  222 +.. templatetag:: comment_form_target
  223 +
  224 +Getting the comment form target
  225 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  226 +
  227 +You may have noticed that the above example uses another template tag --
  228 +:ttag:`comment_form_target` -- to actually get the ``action`` attribute of the
  229 +form. This will always return the correct URL that comments should be posted to;
  230 +you'll always want to use it like above::
  231 +
  232 + <form action="{% comment_form_target %}" method="post">
  233 +
  234 +Redirecting after the comment post
  235 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  236 +
  237 +To specify the URL you want to redirect to after the comment has been posted,
  238 +you can include a hidden form input called ``next`` in your comment form. For example::
  239 +
  240 + <input type="hidden" name="next" value="{% url 'my_comment_was_posted' %}" />
  241 +
  242 +Providing a comment form for authenticated users
  243 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  244 +
  245 +If a user is already authenticated, it makes little sense to display the name,
  246 +email, and URL fields, since these can already be retrieved from their login
  247 +data and profile. In addition, some sites will only accept comments from
  248 +authenticated users.
  249 +
  250 +To provide a comment form for authenticated users, you can manually provide the
  251 +additional fields expected by the Django comments framework. For example,
  252 +assuming comments are attached to the model "object"::
  253 +
  254 + {% if user.is_authenticated %}
  255 + {% get_comment_form for object as form %}
  256 + <form action="{% comment_form_target %}" method="POST">
  257 + {% csrf_token %}
  258 + {{ form.comment }}
  259 + {{ form.honeypot }}
  260 + {{ form.content_type }}
  261 + {{ form.object_pk }}
  262 + {{ form.timestamp }}
  263 + {{ form.security_hash }}
  264 + <input type="hidden" name="next" value="{% url 'object_detail_view' object.id %}" />
  265 + <input type="submit" value="Add comment" id="id_submit" />
  266 + </form>
  267 + {% else %}
  268 + <p>Please <a href="{% url 'auth_login' %}">log in</a> to leave a comment.</p>
  269 + {% endif %}
  270 +
  271 +The honeypot, content_type, object_pk, timestamp, and security_hash fields are
  272 +fields that would have been created automatically if you had simply used
  273 +``{{ form }}`` in your template, and are referred to in `Notes on the comment
  274 +form`_ below.
  275 +
  276 +Note that we do not need to specify the user to be associated with comments
  277 +submitted by authenticated users. This is possible because the :doc:`Built-in
  278 +Comment Models</ref/contrib/comments/models>` that come with Django associate
  279 +comments with authenticated users by default.
  280 +
  281 +In this example, the honeypot field will still be visible to the user; you'll
  282 +need to hide that field in your CSS::
  283 +
  284 + #id_honeypot {
  285 + display: none;
  286 + }
  287 +
  288 +If you want to accept either anonymous or authenticated comments, replace the
  289 +contents of the "else" clause above with a standard comment form and the right
  290 +thing will happen whether a user is logged in or not.
  291 +
  292 +.. _notes-on-the-comment-form:
  293 +
  294 +Notes on the comment form
  295 +-------------------------
  296 +
  297 +The form used by the comment system has a few important anti-spam attributes you
  298 +should know about:
  299 +
  300 +* It contains a number of hidden fields that contain timestamps, information
  301 + about the object the comment should be attached to, and a "security hash"
  302 + used to validate this information. If someone tampers with this data --
  303 + something comment spammers will try -- the comment submission will fail.
  304 +
  305 + If you're rendering a custom comment form, you'll need to make sure to
  306 + pass these values through unchanged.
  307 +
  308 +* The timestamp is used to ensure that "reply attacks" can't continue very
  309 + long. Users who wait too long between requesting the form and posting a
  310 + comment will have their submissions refused.
  311 +
  312 +* The comment form includes a "honeypot_" field. It's a trap: if any data is
  313 + entered in that field, the comment will be considered spam (spammers often
  314 + automatically fill in all fields in an attempt to make valid submissions).
  315 +
  316 + The default form hides this field with a piece of CSS and further labels
  317 + it with a warning field; if you use the comment form with a custom
  318 + template you should be sure to do the same.
  319 +
  320 +The comments app also depends on the more general :doc:`Cross Site Request
  321 +Forgery protection </ref/contrib/csrf>` that comes with Django. As described in
  322 +the documentation, it is best to use ``CsrfViewMiddleware``. However, if you
  323 +are not using that, you will need to use the ``csrf_protect`` decorator on any
  324 +views that include the comment form, in order for those views to be able to
  325 +output the CSRF token and cookie.
  326 +
  327 +.. _honeypot: http://en.wikipedia.org/wiki/Honeypot_(computing)
Please register or login to post a comment