######################################
Template names and directory structure
######################################

As introduced in the previous chapter, the "form_layouts" template tag library 
lets you customize several levels of form rendering. The template tag library 
searches for templates in a particular directory structure.

********
Overview
********

The default structure provided by Django-formrenderingtools is:

* templates => a template directory, included in settings.TEMPLATE_DIRS

  * form_layouts => a directory for the form_layouts material

    * default => the default layout
      
      * field => templates for fields
      * field_errors
      * field_list
      * form
      * form_errors
      * help_text
      * label

Every element in the list above is a folder. It contains one default.html 
template.

If you look at the templates provided by formrenderingtools, you will notice
that "templates/form_layouts" also contains the following folders:

* as_ul => a layout that reproduces {{ form.as_ul }}
* as_p => a layout that reproduces {{ form.as_p }}
* as_table => a layout that reproduces {{ form.as_table }}

These layouts exist for demonstration and migration purposes. They are based 
on the default layout. You can read the template code to create your own 
layouts.

***************************
How to use other templates?
***************************

Several parameters allow you to change the locations where template selection
occurs:

* the "layout" parameter of the tags in the "form_layouts" template tag 
  library. You can use whatever you want provided it is a valid directory name,
  without leading and trailing slashes:
  
  .. code-block:: django
    
    {% form layout="contact_form" %}
    {% form layout="user_account/register" %}
  
  **The "layout" parameter affects nested elements**. It means that using 
  {% form layout="contact" %} will generate implicit 
  {% field layout="contact" %} calls.

* the "template" parameter of the tags in the "form_layouts" template tag 
  library. You can use whatever you want provided it is a valid file name.
  Do not forget the extension:
  
  .. code-block:: django
    
    {% form template="contact_form.html" %}
    {% form template="user/register.html" %}
  
  **The "template" parameter affects only the current element**. It means that 
  using {% form template="contact.html" %} will generate implicit calls with 
  default template, as {% field template="default.html" %}.

********
Priority
********

As an example, if you didn't change the default template and layout names,
{% form layout='LAYOUT/DIR' template="TEMPLATE/NAME.html" %} will use the
first existing template in the following list:

* form_layouts/LAYOUT/DIR/form/TEMPLATE/NAME.html
* form_layouts/default/form/TEMPLATE/NAME.html
* form_layouts/LAYOUT/DIR/form/default.html
* form_layouts/default/form/default.html

Similar rules are used for other elements.

********************
Additional variables
********************

Keep in mind that, in general use case, the "layout" and "template" parameters 
should be enough to get the result you want. The following parameters are 
documented for contributors:

* settings.FORMRENDERINGTOOLS_DEFAULT_LAYOUT: allows you to change the implicit
  value of the "layout" parameter. Default value is "default". Notice that you 
  can get exactly the same result by overriding the form_layouts/default/* 
  templates: simply make sure that the templates in your project/application 
  have priority over the ones provided by formrenderingtools.
* settings.FORMRENDERINGTOOLS_DEFAULT_TEMPLATE: allows you to change the 
  implicit value of the "template" parameter. Default value is "default.html". 
  Notice that you can get exactly the same result by overriding the 
  form_layouts/default/{ELEMENT_NAME}/default.html templates: simply make sure 
  that the templates in your project/application have priority over the ones 
  provided by formrenderingtools.
* settings.FORMRENDERINGTOOLS_TEMPLATE_DIR. A prefix for all templates used by
  the django-formrenderingtools application. It is not recommended to change
  it, because you should be able to perform the same thing by using one of the 
  previously described tip.
