├── .editorconfig ├── .gitignore ├── .travis.yml ├── CHANGES.txt ├── LICENSE ├── MANIFEST.in ├── README.rst ├── docs ├── Makefile ├── _static │ └── example.png ├── conf.py ├── index.rst ├── install.rst └── make.bat ├── example ├── app │ ├── __init__.py │ ├── forms.py │ ├── models.py │ ├── templates │ │ └── index.html │ ├── tests.py │ └── views.py ├── example │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── manage.py └── requirements.txt ├── runtests.py ├── semanticuiform ├── __init__.py ├── config.py ├── fixtures │ ├── basic.html │ └── inline.html ├── meta.py ├── models.py ├── templates │ └── semanticui │ │ ├── field.html │ │ ├── form.html │ │ └── formset.html ├── templatetags │ ├── __init__.py │ └── semanticui.py └── tests.py ├── setup.py └── tests └── test_settings.py /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 4 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.egg 3 | *.egg-info 4 | .DS_Store 5 | docs/_build 6 | /build 7 | /dist 8 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | python: 3 | - '2.7' 4 | - '3.3' 5 | - '3.4' 6 | install: 7 | - pip install coverage coveralls 8 | script: 9 | - coverage run --source=semanticuiform setup.py test 10 | after_success: 11 | - coveralls 12 | deploy: 13 | provider: pypi 14 | user: peterbe 15 | password: 16 | secure: eV46DAh+a4chCo/MaE7oqknzRaynF/oUnzLBD3MV/JYZEo5I09q3Fw92im3TOLUJKFqSti17VmWxLbStEci993xJwaMl3rteq8xuOI8k8aixnBY3333UDhTaV2RLAmX/0MeHgFKXONZMf8ngVAGs7X3y8pwsVUuxa8UNUPr78BzPSFiVQiUfByTzJIxotDj0uk4xdVhI3DOg9v3piFKC/9n6TsWX4B1N53Ro7xU80emULN35YVnPLmcdcegnH3Jllp/dbi8a8MwaEnuAXixP6qkrvhMzBYIgxeutgyjj6Eb1Mr9ufrkgGVGLAEqdNOSYLhr30AZUwOyIUunsceAi9bFC6jf8Jz2JlJangZAOl5eKFf3IZq7SCTFQcHU48yh5Y6dhEVRNo/Sz0XuuXC/JmY9TOsryn5F2oHd4nyqxf4P7PbZF2lvU3SjCPBAZWWZVIN39WKFIdmmcfcxLNuFduOOr6CgbZLqZ8W2cqzH8xKEHhKDv3pLP+WWCsOdQjufViggxmB7HjMhTOYcDtRzaNmeak34WikZ55pUeQv+AO543hMhMgSQSFxSG+agJJLbcz1WTn/DAukfecbaEVV1h8LtaoreNHt/N9/semsfCDBZYJrjoeeWBYs4f5P+dXPWlfANwjtZubYXRWWeza85PW85a7BuKf2ij/Psml3B4OzA= 17 | on: 18 | repo: peterbe/django-semanticui-form 19 | distributions: "sdist bdist_wheel" 20 | -------------------------------------------------------------------------------- /CHANGES.txt: -------------------------------------------------------------------------------- 1 | - 2015-09-12: 2 | 3 | Rought, half-decent draft 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) Peter Bengtsson and individual contributors. 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without modification, 5 | are permitted provided that the following conditions are met: 6 | 7 | 1. Redistributions of source code must retain the above copyright notice, 8 | this list of conditions and the following disclaimer. 9 | 10 | 2. Redistributions in binary form must reproduce the above copyright 11 | notice, this list of conditions and the following disclaimer in the 12 | documentation and/or other materials provided with the distribution. 13 | 14 | 3. Neither the name of django-semanticui-form nor the names of its 15 | contributors may be used to endorse or promote products derived from 16 | this software without specific prior written permission. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 19 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 22 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 24 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 25 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 27 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include README.rst 2 | graft semanticuiform/templates 3 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | ======================= 2 | Django Semantic UI form 3 | ======================= 4 | 5 | .. image:: https://badge.fury.io/py/django-semanticui-form.png 6 | :alt: PyPI version 7 | :target: https://pypi.python.org/pypi/django-semanticui-form 8 | 9 | .. image:: https://travis-ci.org/peterbe/django-semanticui-form.png?branch=master 10 | :target: https://travis-ci.org/peterbe/django-semanticui-form 11 | 12 | .. image:: https://coveralls.io/repos/peterbe/django-semanticui-form/badge.png?branch=master 13 | :target: https://coveralls.io/r/peterbe/django-semanticui-form?branch=master 14 | 15 | 16 | Semantic UI for Django Form. 17 | 18 | A simple Django template tag to work with `Semantic UI `_ 19 | 20 | This project is a fork from 21 | `django-bootstrap-form `_ by 22 | `tzangms `_. 23 | 24 | Usage 25 | ====== 26 | 27 | Add ``semanticuiform`` to your ``INSTALLED_APPS``. 28 | 29 | At the top of your template load in our template tags:: 30 | 31 | {% load semanticui %} 32 | 33 | Then to render your form:: 34 | 35 |
36 | Form Title 37 | {% csrf_token %} 38 | {{ form|semanticui }} 39 | 40 |
41 | 42 | To make the form with inline element, change the ``|semanticui`` template 43 | tag to ``|semanticui_inline``.:: 44 | 45 |
46 | Form Title 47 | {% csrf_token %} 48 | {{ form|semanticui_inline }} 49 | 50 |
51 | 52 | 53 | Demo 54 | ===== 55 | 56 | Not yet. 57 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 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 ' where 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/djangosemanticuiform.qhcp" 81 | @echo "To view the help file:" 82 | @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/djangosemanticuiform.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/djangosemanticuiform" 90 | @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/djangosemanticuiform" 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." 154 | -------------------------------------------------------------------------------- /docs/_static/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peterbe/django-semanticui-form/0087156d12cb04d70d6bb54de20f5b322532d0ed/docs/_static/example.png -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # django semanticui form documentation build configuration file, created by 4 | # sphinx-quickstart on Tue Jul 17 16:36:38 2012. 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 = [] 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 = '.rst' 35 | 36 | # The encoding of source files. 37 | #source_encoding = 'utf-8-sig' 38 | 39 | # The master toctree document. 40 | master_doc = 'index' 41 | 42 | # General information about the project. 43 | project = u'django-semanticui-form' 44 | copyright = u'2015, Peter Bengtsson' 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 = '2.0.6' 52 | # The full version, including alpha/beta/rc tags. 53 | release = '2.0.6' 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 = 'nature' 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 | # " v 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 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 = 'djangosemanticuiformdoc' 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 | ('index', 'djangosemanticuiform.tex', u'django semanticui form Documentation', 187 | u'peterbe', '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 | ('index', 'djangosemanticuiform', u'django semanticui form Documentation', 217 | [u'peterbe'], 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 | ('index', 'djangosemanticuiform', u'django semanticui form Documentation', 231 | u'peterbe', 'djangosemanticuiform', '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 | -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | .. django semanticui form documentation master file, created by 2 | sphinx-quickstart on Tue Jul 17 16:36:38 2012. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | Welcome to django semanticui form's documentation! 7 | ================================================= 8 | 9 | .. toctree:: 10 | :maxdepth: 2 11 | 12 | 13 | .. include:: install.rst 14 | 15 | 16 | Indices and tables 17 | ================== 18 | 19 | * :ref:`genindex` 20 | * :ref:`modindex` 21 | * :ref:`search` 22 | 23 | -------------------------------------------------------------------------------- /docs/install.rst: -------------------------------------------------------------------------------- 1 | ====================== 2 | Django semanticui form 3 | ====================== 4 | 5 | Generate `Semantic UI `_ form output for Django form 6 | 7 | 8 | 9 | Screenshot 10 | ----------- 11 | 12 | .. image:: _static/example.png 13 | 14 | 15 | Installation 16 | ------------ 17 | 18 | Install ``django-semanticui-form`` with pip 19 | 20 | .. code-block:: sh 21 | 22 | $ pip install django-semanticui-form 23 | 24 | 25 | 26 | 27 | Configuration 28 | ------------- 29 | 30 | Add ``semanticuiform`` to ``INSTALLED_APPS``. 31 | 32 | .. code-block:: python 33 | 34 | INSTALLED_APPS = ( 35 | ... 36 | 'semanticuiform', 37 | ... 38 | ) 39 | 40 | 41 | Usage 42 | ------ 43 | 44 | .. code-block:: none 45 | 46 | {% load semanticui %} 47 | 48 | {{ form|semanticui }} 49 | 50 | # or use with individual field 51 | {{ form.|semanticui }} - To output individual fields 52 | 53 | # For inline forms 54 | {{ form|semanticui_inline }} 55 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 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 ^` where ^ 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\djangosemanticuiform.qhcp 103 | echo.To view the help file: 104 | echo.^> assistant -collectionFile %BUILDDIR%\qthelp\djangosemanticuiform.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 191 | -------------------------------------------------------------------------------- /example/app/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peterbe/django-semanticui-form/0087156d12cb04d70d6bb54de20f5b322532d0ed/example/app/__init__.py -------------------------------------------------------------------------------- /example/app/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | 3 | CHOICES = ( 4 | (0, 'Zero'), 5 | (1, 'One'), 6 | (2, 'Two'), 7 | ) 8 | 9 | class ExampleForm(forms.Form): 10 | char_field = forms.CharField() 11 | optional_char_field = forms.CharField(required=False) 12 | choice_field = forms.ChoiceField(choices=CHOICES) 13 | radio_choice = forms.ChoiceField(choices=CHOICES, widget=forms.RadioSelect) 14 | multiple_choice = forms.MultipleChoiceField(choices=CHOICES) 15 | multiple_checkbox = forms.MultipleChoiceField( 16 | choices=CHOICES, widget=forms.CheckboxSelectMultiple) 17 | file_fied = forms.FileField() 18 | password_field = forms.CharField(widget=forms.PasswordInput) 19 | textarea = forms.CharField(widget=forms.Textarea) 20 | boolean_field = forms.BooleanField() 21 | optional_boolean_field = forms.BooleanField(required=False) 22 | -------------------------------------------------------------------------------- /example/app/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /example/app/templates/index.html: -------------------------------------------------------------------------------- 1 | {% load semanticui %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | SemanticUI form example 9 | 15 | 16 | 17 | 18 |
19 |
20 |
21 |

SemanticUI form example

22 | 23 |

below demostate how the form looks with SemanticUI

24 |
25 |
26 | 27 | 28 |
29 |
30 |

Basic example

31 | 32 |
33 | 34 |
35 | {{ form|semanticui }} 36 | 37 |
38 |
39 |
40 | 41 | 42 | 43 |
44 |
45 |

Inline form

46 | 47 |
48 | 49 |
50 | {{ form|semanticui_inline }} 51 | 52 |
53 |
54 |
55 | 56 |
57 | 58 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /example/app/tests.py: -------------------------------------------------------------------------------- 1 | """ 2 | This file demonstrates writing tests using the unittest module. These will pass 3 | when you run "manage.py test". 4 | 5 | Replace this with more appropriate tests for your application. 6 | """ 7 | 8 | from django.test import TestCase 9 | 10 | 11 | class SimpleTest(TestCase): 12 | def test_basic_addition(self): 13 | """ 14 | Tests that 1 + 1 always equals 2. 15 | """ 16 | self.assertEqual(1 + 1, 2) 17 | -------------------------------------------------------------------------------- /example/app/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | from app.forms import ExampleForm 3 | 4 | def index(request): 5 | form = ExampleForm() 6 | 7 | return render(request, 'index.html', {'form': form}) 8 | -------------------------------------------------------------------------------- /example/example/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peterbe/django-semanticui-form/0087156d12cb04d70d6bb54de20f5b322532d0ed/example/example/__init__.py -------------------------------------------------------------------------------- /example/example/settings.py: -------------------------------------------------------------------------------- 1 | # Django settings for example project. 2 | 3 | DEBUG = True 4 | TEMPLATE_DEBUG = DEBUG 5 | 6 | ADMINS = ( 7 | # ('Your Name', 'your_email@example.com'), 8 | ) 9 | 10 | MANAGERS = ADMINS 11 | 12 | DATABASES = { 13 | 'default': { 14 | 'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 15 | 'NAME': '', # Or path to database file if using sqlite3. 16 | 'USER': '', # Not used with sqlite3. 17 | 'PASSWORD': '', # Not used with sqlite3. 18 | 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. 19 | 'PORT': '', # Set to empty string for default. Not used with sqlite3. 20 | } 21 | } 22 | 23 | # Local time zone for this installation. Choices can be found here: 24 | # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name 25 | # although not all choices may be available on all operating systems. 26 | # In a Windows environment this must be set to your system time zone. 27 | TIME_ZONE = 'America/Chicago' 28 | 29 | # Language code for this installation. All choices can be found here: 30 | # http://www.i18nguy.com/unicode/language-identifiers.html 31 | LANGUAGE_CODE = 'en-us' 32 | 33 | SITE_ID = 1 34 | 35 | # If you set this to False, Django will make some optimizations so as not 36 | # to load the internationalization machinery. 37 | USE_I18N = True 38 | 39 | # If you set this to False, Django will not format dates, numbers and 40 | # calendars according to the current locale. 41 | USE_L10N = True 42 | 43 | # If you set this to False, Django will not use timezone-aware datetimes. 44 | USE_TZ = True 45 | 46 | # Absolute filesystem path to the directory that will hold user-uploaded files. 47 | # Example: "/home/media/media.lawrence.com/media/" 48 | MEDIA_ROOT = '' 49 | 50 | # URL that handles the media served from MEDIA_ROOT. Make sure to use a 51 | # trailing slash. 52 | # Examples: "http://media.lawrence.com/media/", "http://example.com/media/" 53 | MEDIA_URL = '' 54 | 55 | # Absolute path to the directory static files should be collected to. 56 | # Don't put anything in this directory yourself; store your static files 57 | # in apps' "static/" subdirectories and in STATICFILES_DIRS. 58 | # Example: "/home/media/media.lawrence.com/static/" 59 | STATIC_ROOT = '' 60 | 61 | # URL prefix for static files. 62 | # Example: "http://media.lawrence.com/static/" 63 | STATIC_URL = '/static/' 64 | 65 | # Additional locations of static files 66 | STATICFILES_DIRS = ( 67 | # Put strings here, like "/home/html/static" or "C:/www/django/static". 68 | # Always use forward slashes, even on Windows. 69 | # Don't forget to use absolute paths, not relative paths. 70 | ) 71 | 72 | # List of finder classes that know how to find static files in 73 | # various locations. 74 | STATICFILES_FINDERS = ( 75 | 'django.contrib.staticfiles.finders.FileSystemFinder', 76 | 'django.contrib.staticfiles.finders.AppDirectoriesFinder', 77 | # 'django.contrib.staticfiles.finders.DefaultStorageFinder', 78 | ) 79 | 80 | # Make this unique, and don't share it with anybody. 81 | SECRET_KEY = 'iixsk9ic0h&zgpvnie&o!%fl6f&j-xnfm!j#6zialnxqsw%21p' 82 | 83 | # List of callables that know how to import templates from various sources. 84 | TEMPLATE_LOADERS = ( 85 | 'django.template.loaders.filesystem.Loader', 86 | 'django.template.loaders.app_directories.Loader', 87 | # 'django.template.loaders.eggs.Loader', 88 | ) 89 | 90 | MIDDLEWARE_CLASSES = ( 91 | 'django.middleware.common.CommonMiddleware', 92 | 'django.contrib.sessions.middleware.SessionMiddleware', 93 | 'django.middleware.csrf.CsrfViewMiddleware', 94 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 95 | 'django.contrib.messages.middleware.MessageMiddleware', 96 | # Uncomment the next line for simple clickjacking protection: 97 | # 'django.middleware.clickjacking.XFrameOptionsMiddleware', 98 | ) 99 | 100 | ROOT_URLCONF = 'example.urls' 101 | 102 | # Python dotted path to the WSGI application used by Django's runserver. 103 | WSGI_APPLICATION = 'example.wsgi.application' 104 | 105 | TEMPLATE_DIRS = ( 106 | # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". 107 | # Always use forward slashes, even on Windows. 108 | # Don't forget to use absolute paths, not relative paths. 109 | ) 110 | 111 | INSTALLED_APPS = ( 112 | 'django.contrib.auth', 113 | 'django.contrib.contenttypes', 114 | 'django.contrib.sessions', 115 | 'django.contrib.sites', 116 | 'django.contrib.messages', 117 | 'django.contrib.staticfiles', 118 | 'semanticuiform', 119 | 'app', 120 | # Uncomment the next line to enable the admin: 121 | # 'django.contrib.admin', 122 | # Uncomment the next line to enable admin documentation: 123 | # 'django.contrib.admindocs', 124 | ) 125 | 126 | # A sample logging configuration. The only tangible logging 127 | # performed by this configuration is to send an email to 128 | # the site admins on every HTTP 500 error when DEBUG=False. 129 | # See http://docs.djangoproject.com/en/dev/topics/logging for 130 | # more details on how to customize your logging configuration. 131 | LOGGING = { 132 | 'version': 1, 133 | 'disable_existing_loggers': False, 134 | 'filters': { 135 | 'require_debug_false': { 136 | '()': 'django.utils.log.RequireDebugFalse' 137 | } 138 | }, 139 | 'handlers': { 140 | 'mail_admins': { 141 | 'level': 'ERROR', 142 | 'filters': ['require_debug_false'], 143 | 'class': 'django.utils.log.AdminEmailHandler' 144 | } 145 | }, 146 | 'loggers': { 147 | 'django.request': { 148 | 'handlers': ['mail_admins'], 149 | 'level': 'ERROR', 150 | 'propagate': True, 151 | }, 152 | } 153 | } 154 | -------------------------------------------------------------------------------- /example/example/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls import patterns, include, url 2 | 3 | # Uncomment the next two lines to enable the admin: 4 | # from django.contrib import admin 5 | # admin.autodiscover() 6 | 7 | urlpatterns = patterns('', 8 | # Examples: 9 | (r'^$', 'app.views.index'), 10 | # url(r'^$', 'example.views.home', name='home'), 11 | # url(r'^example/', include('example.foo.urls')), 12 | 13 | # Uncomment the admin/doc line below to enable admin documentation: 14 | # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), 15 | 16 | # Uncomment the next line to enable the admin: 17 | # url(r'^admin/', include(admin.site.urls)), 18 | ) 19 | -------------------------------------------------------------------------------- /example/example/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for example project. 3 | 4 | This module contains the WSGI application used by Django's development server 5 | and any production WSGI deployments. It should expose a module-level variable 6 | named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover 7 | this application via the ``WSGI_APPLICATION`` setting. 8 | 9 | Usually you will have the standard Django WSGI application here, but it also 10 | might make sense to replace the whole Django WSGI application with a custom one 11 | that later delegates to the Django one. For example, you could introduce WSGI 12 | middleware here, or combine a Django application with an application of another 13 | framework. 14 | 15 | """ 16 | import os 17 | 18 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "example.settings") 19 | 20 | # This application object is used by any WSGI server configured to use this 21 | # file. This includes Django's development server, if the WSGI_APPLICATION 22 | # setting points here. 23 | from django.core.wsgi import get_wsgi_application 24 | application = get_wsgi_application() 25 | 26 | # Apply WSGI middleware here. 27 | # from helloworld.wsgi import HelloWorldApplication 28 | # application = HelloWorldApplication(application) 29 | -------------------------------------------------------------------------------- /example/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | sys.path.append('..') 6 | 7 | if __name__ == "__main__": 8 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "example.settings") 9 | 10 | from django.core.management import execute_from_command_line 11 | 12 | execute_from_command_line(sys.argv) 13 | -------------------------------------------------------------------------------- /example/requirements.txt: -------------------------------------------------------------------------------- 1 | Django>=1.4 2 | -------------------------------------------------------------------------------- /runtests.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import sys 4 | import django 5 | from os.path import dirname, abspath 6 | 7 | from django.conf import settings 8 | 9 | 10 | 11 | settings.configure( 12 | DATABASES = { 13 | 'default': { 14 | 'ENGINE': 'django.db.backends.sqlite3', 15 | 'NAME': ':memory:' 16 | } 17 | }, 18 | INSTALLED_APPS=[ 19 | 'django.contrib.admin', 20 | 'django.contrib.auth', 21 | 'django.contrib.contenttypes', 22 | 'django.contrib.sessions', 23 | 'django.contrib.sites', 24 | 'semanticuiform', 25 | ], 26 | MIDDLEWARE_CLASSES = ( 27 | 'django.contrib.sessions.middleware.SessionMiddleware', 28 | 'django.middleware.common.CommonMiddleware', 29 | 'django.middleware.csrf.CsrfViewMiddleware', 30 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 31 | 'django.contrib.messages.middleware.MessageMiddleware', 32 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 33 | ), 34 | SITE_ID=1, 35 | DEBUG=False, 36 | ROOT_URLCONF='', 37 | ) 38 | 39 | 40 | 41 | def runtests(**test_args): 42 | from django.test.utils import get_runner 43 | 44 | parent = dirname(abspath(__file__)) 45 | sys.path.insert(0, parent) 46 | 47 | try: 48 | django.setup() 49 | except: 50 | pass 51 | 52 | TestRunner = get_runner(settings) 53 | test_runner = TestRunner(verbosity=1, interactive=True) 54 | failures = test_runner.run_tests(['semanticuiform'], test_args) 55 | sys.exit(failures) 56 | 57 | 58 | if __name__ == '__main__': 59 | runtests(*sys.argv[1:]) 60 | -------------------------------------------------------------------------------- /semanticuiform/__init__.py: -------------------------------------------------------------------------------- 1 | from .meta import VERSION 2 | 3 | 4 | __version__ = str(VERSION) 5 | 6 | -------------------------------------------------------------------------------- /semanticuiform/config.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | 3 | 4 | # BOOTSTRAP_COLUMN_COUNT = getattr(settings, 'BOOTSTRAP_COLUMN_COUNT', 12) 5 | -------------------------------------------------------------------------------- /semanticuiform/fixtures/basic.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 | 7 |
8 | 9 | 14 |
15 | 16 | 17 |
18 | 19 | 20 |
21 |
22 | 23 | 24 |
25 |
26 | 27 |
28 |
29 | 30 | 31 |
32 |
33 | 34 |
35 |
36 | 37 | 38 |
39 |
40 | 41 |
42 | 43 | 44 | 45 |
46 | 47 | 48 | 49 | 54 | 55 |
56 | 57 | 58 | 59 |
60 | 61 | 62 |
    63 |
  • 64 | 66 |
  • 67 |
  • 68 | 70 |
  • 71 |
  • 72 | 74 |
  • 75 |
76 | 77 |
78 | 79 | 80 | 81 |
82 | 83 | 84 | 85 | 86 |
87 | 88 | 89 | 90 |
91 | 92 | 93 | 94 | 95 |
96 | 97 | 98 | 99 |
100 | 101 | 102 | 103 | 105 | 106 |
107 | 108 | 109 | 110 |
111 |
112 | 113 | 114 | 115 | 116 |
117 |
118 | -------------------------------------------------------------------------------- /semanticuiform/fixtures/inline.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 6 | 7 |
8 | 9 | 14 |
15 | 16 | 17 |
18 | 19 | 20 |
21 |
22 | 23 | 24 |
25 |
26 | 27 |
28 |
29 | 30 | 31 |
32 |
33 | 34 |
35 |
36 | 37 | 38 |
39 |
40 | 41 |
42 | 43 | 44 | 45 |
46 | 47 | 48 | 49 | 54 | 55 |
56 | 57 | 58 | 59 |
60 | 61 | 62 |
    63 |
  • 64 | 66 |
  • 67 |
  • 68 | 70 |
  • 71 |
  • 72 | 74 |
  • 75 |
76 | 77 |
78 | 79 | 80 | 81 |
82 | 83 | 84 | 85 | 86 |
87 | 88 | 89 | 90 |
91 | 92 | 93 | 94 | 95 |
96 | 97 | 98 | 99 |
100 | 101 | 102 | 103 | 105 | 106 |
107 | 108 | 109 | 110 |
111 |
112 | 113 | 114 | 115 | 116 |
117 |
118 | -------------------------------------------------------------------------------- /semanticuiform/meta.py: -------------------------------------------------------------------------------- 1 | from distutils.version import StrictVersion 2 | 3 | 4 | VERSION = StrictVersion('0.0.1') 5 | -------------------------------------------------------------------------------- /semanticuiform/models.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peterbe/django-semanticui-form/0087156d12cb04d70d6bb54de20f5b322532d0ed/semanticuiform/models.py -------------------------------------------------------------------------------- /semanticuiform/templates/semanticui/field.html: -------------------------------------------------------------------------------- 1 | {% load semanticui %} 2 | 3 | {% if field|is_checkbox %} 4 |
5 |
6 | {% if field.auto_id %} 7 | {{ field }} 8 | 9 | {% endif %} 10 | {% for error in field.errors %} 11 | {{ error }} 12 | {% endfor %} 13 | 14 | {% if field.help_text %} 15 |
16 | {{ field.help_text|safe }} 17 |
18 | {% endif %} 19 |
20 |
21 | {% elif field|is_radio %} 22 | 23 |
24 | {% if field.auto_id %} 25 | 26 | {% endif %} 27 | {% for choice in field %} 28 |
29 |
30 | {{ choice.tag }} 31 | 32 |
33 |
34 | {% endfor %} 35 | 36 | {% for error in field.errors %} 37 | {{ error }} 38 | {% endfor %} 39 | 40 | {% if field.help_text %} 41 |
42 | {{ field.help_text|safe }} 43 |
44 | {% endif %} 45 |
46 | 47 | {% else %} 48 |
49 | {% if field.auto_id %} 50 | 51 | {% endif %} 52 | 53 | {% if 'icon' in field.field.widget.attrs %} 54 |
55 | {{ field }} 56 | 57 |
58 | {% else %} 59 | {{ field }} 60 | {% endif %} 61 | 62 | {% for error in field.errors %} 63 | {{ error }} 64 | {% endfor %} 65 | 66 | {% if field.help_text %} 67 |
68 | {{ field.help_text|safe }} 69 |
70 | {% endif %} 71 |
72 | {% endif %} 73 | -------------------------------------------------------------------------------- /semanticuiform/templates/semanticui/form.html: -------------------------------------------------------------------------------- 1 | {% if form.non_field_errors %} 2 |
3 |
Error
4 | {% for non_field_error in form.non_field_errors %} 5 |

{{ non_field_error }}

6 | {% endfor %} 7 |
8 | {% endif %} 9 | 10 | {% for field in form.hidden_fields %} 11 | {{ field }} 12 | {% endfor %} 13 | 14 | {% for field in form.visible_fields %} 15 | {% include 'semanticui/field.html' %} 16 | {% endfor %} 17 | -------------------------------------------------------------------------------- /semanticuiform/templates/semanticui/formset.html: -------------------------------------------------------------------------------- 1 | {{ formset.management_form }} 2 | 3 | {% for form in formset %} 4 | {% if classes.label == 'sr-only' %} 5 |
6 | {% include "semanticuiform/form.html" with form=form %} 7 |
8 | {%else%} 9 | {% include "semanticuiform/form.html" with form=form %} 10 | {% endif %} 11 | {% endfor %} 12 | -------------------------------------------------------------------------------- /semanticuiform/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peterbe/django-semanticui-form/0087156d12cb04d70d6bb54de20f5b322532d0ed/semanticuiform/templatetags/__init__.py -------------------------------------------------------------------------------- /semanticuiform/templatetags/semanticui.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from django.template import Context 3 | from django.template.loader import get_template 4 | from django import template 5 | 6 | from semanticuiform import config 7 | 8 | register = template.Library() 9 | 10 | @register.filter 11 | def semanticui(element): 12 | markup_classes = {'label': '', 'value': '', 'single_value': ''} 13 | return render(element, markup_classes, False) 14 | 15 | 16 | @register.filter 17 | def semanticui_inline(element, label_cols=''): 18 | 19 | markup_classes = {'label': label_cols, 'value': '', 'single_value': ''} 20 | 21 | # for cl in label_cols.split(' '): 22 | # splitted_class = cl.split('-') 23 | # 24 | # try: 25 | # value_nb_cols = int(splitted_class[-1]) 26 | # except ValueError: 27 | # value_nb_cols = config.BOOTSTRAP_COLUMN_COUNT 28 | # 29 | # if value_nb_cols >= config.BOOTSTRAP_COLUMN_COUNT: 30 | # splitted_class[-1] = config.BOOTSTRAP_COLUMN_COUNT 31 | # else: 32 | # offset_class = cl.split('-') 33 | # offset_class[-1] = 'offset-' + str(value_nb_cols) 34 | # splitted_class[-1] = str(config.BOOTSTRAP_COLUMN_COUNT - value_nb_cols) 35 | # markup_classes['single_value'] += ' ' + '-'.join(offset_class) 36 | # markup_classes['single_value'] += ' ' + '-'.join(splitted_class) 37 | # 38 | # markup_classes['value'] += ' ' + '-'.join(splitted_class) 39 | 40 | return render(element, markup_classes, True) 41 | 42 | # @register.filter 43 | # def add_input_classes(field): 44 | # if not is_checkbox(field) and not is_multiple_checkbox(field) \ 45 | # and not is_radio(field) and not is_file(field): 46 | # field_classes = field.field.widget.attrs.get('class', '') 47 | # field_classes += ' form-control' 48 | # field.field.widget.attrs['class'] = field_classes 49 | 50 | 51 | def render(element, markup_classes, is_inline): 52 | element_type = element.__class__.__name__.lower() 53 | 54 | if element_type == 'boundfield': 55 | # add_input_classes(element) 56 | template = get_template("semanticui/field.html") 57 | context = Context({ 58 | 'field': element, 59 | 'classes': markup_classes, 60 | 'form': element.form, 61 | 'is_inline': is_inline, 62 | }) 63 | else: 64 | has_management = getattr(element, 'management_form', None) 65 | if has_management: 66 | # for form in element.forms: 67 | # for field in form.visible_fields(): 68 | # add_input_classes(field) 69 | template = get_template("semanticui/formset.html") 70 | context = Context({ 71 | 'formset': element, 72 | 'classes': markup_classes, 73 | 'is_inline': is_inline, 74 | }) 75 | else: 76 | # for field in element.visible_fields(): 77 | # add_input_classes(field) 78 | template = get_template("semanticui/form.html") 79 | context = Context({ 80 | 'form': element, 81 | 'classes': markup_classes, 82 | 'is_inline': is_inline, 83 | }) 84 | 85 | return template.render(context) 86 | 87 | 88 | @register.filter 89 | def is_checkbox(field): 90 | return isinstance(field.field.widget, forms.CheckboxInput) 91 | 92 | 93 | @register.filter 94 | def is_multiple_checkbox(field): 95 | return isinstance(field.field.widget, forms.CheckboxSelectMultiple) 96 | 97 | 98 | @register.filter 99 | def is_radio(field): 100 | return isinstance(field.field.widget, forms.RadioSelect) 101 | 102 | 103 | @register.filter 104 | def is_file(field): 105 | return isinstance(field.field.widget, forms.FileInput) 106 | -------------------------------------------------------------------------------- /semanticuiform/tests.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import django 4 | from django.test import TestCase 5 | from django.template import Template, Context 6 | from django.core.management import call_command 7 | from django import forms 8 | 9 | 10 | TEST_DIR = os.path.abspath(os.path.join(__file__, '..')) 11 | 12 | 13 | CHOICES = ( 14 | (0, 'Zero'), 15 | (1, 'One'), 16 | (2, 'Two'), 17 | ) 18 | 19 | try: 20 | # required by Django 1.7 and later 21 | django.setup() 22 | except: 23 | pass 24 | 25 | 26 | class ExampleForm(forms.Form): 27 | char_field = forms.CharField() 28 | choice_field = forms.ChoiceField(choices=CHOICES) 29 | radio_choice = forms.ChoiceField(choices=CHOICES, widget=forms.RadioSelect) 30 | multiple_choice = forms.MultipleChoiceField(choices=CHOICES) 31 | multiple_checkbox = forms.MultipleChoiceField( 32 | choices=CHOICES, 33 | widget=forms.CheckboxSelectMultiple) 34 | file_fied = forms.FileField() 35 | password_field = forms.CharField(widget=forms.PasswordInput) 36 | textarea = forms.CharField(widget=forms.Textarea) 37 | boolean_field = forms.BooleanField() 38 | 39 | 40 | class SemanticUITemplateTagTests(TestCase): 41 | maxDiff = None 42 | 43 | def setUp(self): 44 | call_command('syncdb', interactive=False) 45 | 46 | def test_basic_form(self): 47 | form = ExampleForm() 48 | 49 | html = Template( 50 | "{% load semanticui %}{{ form|semanticui }}" 51 | ).render(Context({'form': form})) 52 | 53 | tpl = os.path.join('fixtures', 'basic.html') 54 | with open(os.path.join(TEST_DIR, tpl)) as f: 55 | content = f.read() 56 | 57 | self.assertHTMLEqual(html, content) 58 | 59 | def test_inline_form(self): 60 | form = ExampleForm() 61 | 62 | html = Template( 63 | "{% load semanticui %}{{ form|semanticui_inline }}" 64 | ).render(Context({'form': form})) 65 | 66 | tpl = os.path.join('fixtures', 'inline.html') 67 | with open(os.path.join(TEST_DIR, tpl)) as f: 68 | content = f.read() 69 | 70 | self.assertHTMLEqual(html, content) 71 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | from semanticuiform.meta import VERSION 3 | 4 | setup( 5 | name='django-semanticui-form', 6 | version=str(VERSION), 7 | description="django-semanticui-form", 8 | classifiers=[ 9 | "Programming Language :: Python", 10 | "Topic :: Software Development :: Libraries :: Python Modules", 11 | "Framework :: Django", 12 | "Environment :: Web Environment", 13 | "Programming Language :: Python :: 2", 14 | "Programming Language :: Python :: 2.7", 15 | "Programming Language :: Python :: 3", 16 | "Programming Language :: Python :: 3.3", 17 | "Programming Language :: Python :: 3.4", 18 | ], 19 | keywords='SemanticUI,django', 20 | author='Peter Bengtsson', 21 | author_email='mail@peterbe.com', 22 | url='http://github.com/peterbe/django-semanticui-form', 23 | license='BSD', 24 | test_suite='runtests.runtests', 25 | install_requires = [ 26 | "django>=1.3", 27 | ], 28 | packages=find_packages(), 29 | include_package_data=True, 30 | zip_safe=False, 31 | ) 32 | -------------------------------------------------------------------------------- /tests/test_settings.py: -------------------------------------------------------------------------------- 1 | import os 2 | local_path = lambda path: os.path.join(os.path.dirname(__file__), path) 3 | 4 | DATABASES = { 5 | 'default': { 6 | 'ENGINE': 'django.db.backends.sqlite3', 7 | 'NAME': ':memory:' 8 | } 9 | } 10 | 11 | SITE_ID = 1 12 | 13 | MIDDLEWARE_CLASSES = ( 14 | 'django.contrib.sessions.middleware.SessionMiddleware', 15 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 16 | 'django.contrib.messages.middleware.MessageMiddleware', 17 | ) 18 | 19 | INSTALLED_APPS = [ 20 | 'django.contrib.contenttypes', 21 | 'django.contrib.sites', 22 | 'django.contrib.sessions', 23 | 'django.contrib.staticfiles', 24 | 'django.contrib.auth', 25 | 'django.contrib.admin', 26 | 'semanticuiform', 27 | ] 28 | 29 | ROOT_URLCONF = 'tests.urls' 30 | 31 | MEDIA_URL = '/media/' 32 | 33 | MEDIA_ROOT = local_path('media') 34 | 35 | STATICFILES_STORAGE = 'pipeline.storage.PipelineStorage' 36 | STATIC_ROOT = local_path('static/') 37 | STATIC_URL = '/static/' 38 | STATICFILES_FINDERS = ( 39 | 'django.contrib.staticfiles.finders.FileSystemFinder', 40 | 'django.contrib.staticfiles.finders.AppDirectoriesFinder' 41 | ) 42 | 43 | TEMPLATE_DIRS = ( 44 | local_path('templates'), 45 | ) 46 | 47 | SECRET_KEY = 'django-semanticui-form' 48 | --------------------------------------------------------------------------------