Commit 768c8b8748513a839a973498244a5f8cdb98e2a0

Authored by Jacob Kaplan-Moss
1 parent ad6d5a6f

Sketched out an import of the docs.

1 1 *.pyc
2 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 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 19 .. toctree::
362 20 :maxdepth: 1
363 21
  22 + quickstart
364 23 models
365 24 signals
366 25 custom
367 26 forms
368 27 moderation
369 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