Skip to main content
# django-widgets-improved

[![Build Status](https://travis-ci.org/simhnna/django-widgets-improved.svg?branch=master)](https://travis-ci.org/simhnna/django-widgets-improved)

Tweak the form field rendering in templates, not in python-level
form definitions. Altering CSS classes and HTML attributes is supported.

That should be enough for designers to customize field presentation (using
CSS and unobtrusive javascript) without touching python code.


This project is a fork of the unmaintained [django-widget-tweaks](https://github.com/jazzband/django-widget-tweaks) repository.
It is a drop-in replacement. Just unintall django-widget-tweaks and install this instead.

## Installation

You can get Django Widget Tweaks by using pip::

$ pip install django-widgets-improved

To enable `widget_tweaks` in your project you need to add it to `INSTALLED_APPS` in your projects
`settings.py` file:

```
INSTALLED_APPS = [
...
'widget_tweaks',
...
]
```

## Usage

This app provides two sets of tools that may be used together or standalone:

1. a `render_field` template tag for customizing form fields by using an
HTML-like syntax.
2. several template filters for customizing form field HTML attributes and CSS
classes

The `render_field` tag should be easier to use and should make form field
customizations much easier for designers and front-end developers.

The template filters are more powerful than the `render_field` tag, but they
use a more complex and less HTML-like syntax.

### render_field

This is a template tag that can be used as an alternative to aforementioned
filters. This template tag renders a field using a syntax similar to plain
HTML attributes.

Example:
```
{% load widget_tweaks %}

<!-- change input type (e.g. to HTML5) -->
{% render_field form.search_query type="search" %}

<!-- add/change several attributes -->
{% render_field form.text rows="20" cols="20" title="Hello, world!" %}

<!-- append to an attribute -->
{% render_field form.title class+="css_class_1 css_class_2" %}

<!-- template variables can be used as attribute values -->
{% render_field form.text placeholder=form.text.label %}
```
For fields rendered with `{% render_field %}` tag it is possible
to set error class and required fields class by using
`WIDGET_ERROR_CLASS` and `WIDGET_REQUIRED_CLASS` template variables:
```
{% with WIDGET_ERROR_CLASS='my_error' WIDGET_REQUIRED_CLASS='my_required' %}
{% render_field form.field1 %}
{% render_field form.field2 %}
{% render_field form.field3 %}
{% endwith %}
```
You can be creative with these variables: e.g. a context processor could
set a default CSS error class on all fields rendered by
`{% render_field %}`.


### attr
Adds or replaces any single html atribute for the form field.

Examples:
```
{% load widget_tweaks %}

<!-- change input type (e.g. to HTML5) -->
{{ form.search_query|attr:"type:search" }}

<!-- add/change several attributes -->
{{ form.text|attr:"rows:20"|attr:"cols:20"|attr:"title:Hello, world!" }}

<!-- attributes without parameters -->
{{ form.search_query|attr:"autofocus" }}
```

### add_class

Adds CSS class to field element. Split classes by whitespace in order to add
several classes at once.

Example:
```
{% load widget_tweaks %}

<!-- add 2 extra css classes to field element -->
{{ form.title|add_class:"css_class_1 css_class_2" }}
```

### set_data

Sets HTML5 data attribute ( http://ejohn.org/blog/html-5-data-attributes/ ).
Useful for unobtrusive javascript. It is just a shortcut for 'attr' filter
that prepends attribute names with 'data-' string.

Example:
```
{% load widget_tweaks %}

<!-- data-filters:"OverText" will be added to input field -->
{{ form.title|set_data:"filters:OverText" }}
```

### append_attr

Appends atribute value with extra data.

Example:
```
{% load widget_tweaks %}

<!-- add 2 extra css classes to field element -->
{{ form.title|append_attr:"class:css_class_1 css_class_2" }}
```
'add_class' filter is just a shortcut for 'append_attr' filter that
adds values to the 'class' attribute.

### add_error_class

The same as 'add_class' but adds css class only if validation failed for
the field (field.errors is not empty).

Example:
```
{% load widget_tweaks %}

<!-- add 'error-border' css class on field error -->
{{ form.title|add_error_class:"error-border" }}
```

### add_error_attr

The same as 'attr' but sets an attribute only if validation failed for
the field (field.errors is not empty). This can be useful when dealing
with accessibility:
```
{% load widget_tweaks %}

<!-- add aria-invalid="true" attribute on field error -->
{{ form.title|add_error_attr:"aria-invalid:true" }}
```

### field_type and widget_type

`'field_type'` and `'widget_type'` are template filters that return
field class name and field widget class name (in lower case).

Example:
```
{% load widget_tweaks %}

<div class="field {{ field|field_type }} {{ field|widget_type }} {{ field.html_name }}">
{{ field }}
</div>
```
Output:
```
<div class="field charfield textinput name">
<input id="id_name" type="text" name="name" maxlength="100" />
</div>
```
## Filter chaining

The order django-widget-tweaks filters apply may seem counter-intuitive
(leftmost filter wins):
```
{{ form.simple|attr:"foo:bar"|attr:"foo:baz" }}
```
returns:
```
<input foo="bar" type="text" name="simple" id="id_simple" />
```
It is not a bug, it is a feature that enables creating reusable templates
with overridable defaults.

Reusable field template example:
```
{# inc/field.html #}
{% load widget_tweaks %}
<div>{{ field|attr:"foo:default_foo" }}</div>
```
Example usage:
```
{# my_template.html #}
{% load widget_tweaks %}
<form method='POST' action=''> {% csrf_token %}
{% include "inc/field.html" with field=form.title %}
{% include "inc/field.html" with field=form.description|attr:"foo:non_default_foo" %}
</form>
```
With 'rightmost filter wins' rule it wouldn't be possible to override
`|attr:"foo:default_foo"` in main template.

## Contributing

If you've found a bug, implemented a feature or have a suggestion,
do not hesitate to contact me, fire an issue or send a pull request.

* Source code: https://github.com/simhnna/django-widgets-improved/
* Bug tracker: https://github.com/simhnna/django-widgets-improved/issues

## Testing

Make sure you have [tox](http://tox.testrun.org/) installed, then type `tox`
from anywhere within the repository.



# Changelog

## 1.4.1 (2015-06-29)
------------------

* fixed a regression in django-widget-tweaks v1.4
(the field is no longer deep copied).

## 1.4 (2015-06-27)

* Django 1.7, 1.8 and 1.9 support;
* setup.py is switched to setuptools;
* testing improvements;
* Python 3.4 support is added;
* Python 2.5 is not longer supported;
* bitbucket repository is no longer supported (development is moved to github).

## 1.3 (2013-04-05)

* added support for ``WIDGET_ERROR_CLASS`` and ``WIDGET_REQUIRED_CLASS``
template variables that affect ``{% render_field %}``.

## 1.2 (2013-03-23)

* new ``add_error_attr`` template filter;
* testing improvements.

## 1.1.2 (2012-06-06)

* support for template variables is added to ``render_field`` tag;
* new ``field_type`` and ``widget_type`` filters.

## 1.1.1 (2012-03-22)

* some issues with ``render_field`` tag are fixed.

## 1.1 (2012-03-22)

* ``render_field`` template tag.

## 1.0 (2012-02-06)

* filters return empty strings instead of raising exceptions if field is missing;
* test running improvements;
* python 3 support;
* undocumented 'behave' filter is removed.

## 0.3 (2011-03-04)

* ``add_error_class`` filter.

## 0.2.1 (2011-02-03)

* Attributes customized in widgets are preserved;
* no more extra whitespaces;
* tests;

## 0.1 (2011-01-12)

Initial release.


Metadata

Release files for django-widgets-improved 1.5.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-widgets-improved 1.5.0
File Size Uploaded Provenance
django-widgets-improved-1.5.0.tar.gz 9.7 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for django-widgets-improved 1.5.0
File Interpreter ABI Platform
django_widgets_improved-1.5.0-py2.py3-none-any.whl Python 2, Python 3 none any Details

Total release size: 22.8 kB

Release files / django-widgets-improved-1.5.0.tar.gz

Download URL django-widgets-improved-1.5.0.tar.gz
Size 9.7 kB
Tags Source
SHA-256 checksum
How to use checksums
7c9e8e931e251e3308b1eddc1b8e8e7312f3bef47e01924835f7ee6ca4c15da1
BLAKE2b-256 checksum
How to use checksums
c02d94e6d6b5a613458ee7b464ad8c6fb219558fd4eef80246f23e1d59762a61
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release files / django_widgets_improved-1.5.0-py2.py3-none-any.whl

Download URL django_widgets_improved-1.5.0-py2.py3-none-any.whl
Size 13.1 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
db66019bfe5bb40e552db2109dab3854c65f1bf7759eef12b2eb574014f9539f
BLAKE2b-256 checksum
How to use checksums
1c7583b607b48aa774218379a3cbb780c402fc4cd8375f77afef9564370c1c79
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Security for django-widgets-improved 1.5.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

1.5.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page