Commit 768c8b8748513a839a973498244a5f8cdb98e2a0
1 parent
ad6d5a6f
Sketched out an import of the docs.
Showing
8 changed files
with
988 additions
and
350 deletions
docs/Makefile
0 → 100644
| 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." | ... | ... |
docs/conf.py
0 → 100644
| 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 | + | ... | ... |
docs/make.bat
0 → 100644
| 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 | ... | ... |
docs/porting.txt
0 → 100644
docs/quickstart.txt
0 → 100644
| 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