django-authtools
A custom user model app for Django 2.2+ that features email as username and other things. It tries to stay true to the built-in user model for the most part.
Read the django-authtools documentation.
Quickstart
Before you use this, you should probably read the documentation about custom User models.
Install the package:
$ pip install django-authtoolsAdd authtools to your INSTALLED_APPS.
Add the following to your settings.py:
AUTH_USER_MODEL = 'authtools.User'Enjoy.
CHANGES
2.1.0 (2026-04-22)
Add support for Django 6.0 (#131)
Add test coverage for Python 3.14
Rewrite BetterReadOnlyPasswordHashWidget to render from its own template (authtools/templates/authtools/widgets/better_read_only_password_hash.html) for compatibility with Django 6.0.
Backwards Incompatible: Remove authtools.forms.is_password_usable
Update tox.ini for tox 4
2.0.2 (2025-09-29)
Support the change in Django 5.0+ to a password change button on user edit pages in the Django admin (Jeff Bradberry #129)
Add test coverage for Django 5.1, 5.2
Add test coverage for Python 3.13
Python 3.7 is no longer availble in GitHub runner using ubuntu-latest
2.0.1 (2024-03-19)
Resolve SHA1PasswordHasher deprecation warning for Django 4.0 and above
Resolve pkg_resources deprecation warning for Python 3.8 and above
Add test coverage for Django 4.1, 4.2, and 5.0
Add test coverage for Python 3.11 and 3.12
Python 3.5 and 3.6 are no longer availble in GitHub runner using ubuntu-latest
2.0.0 (2022-07-29)
** BREAKING **
Remove views and URLs. You can now use the ones built in to Django. Removes support for Django 1.11 and Python 2.
Add support for Django 2.2, 3.0, 3.1, 3.2, and 4.0.
Fix bug where request is not properly set on AuthenticationForm (#102)
Make UserAdmin compatible with Django 2.0 - Fixes a bug where the password change link would not format correctly - Fixes a bug where BetterReadOnlyPasswordWidget would not work on a view only permission
Documentation fixes (#87, #117)
Set DEFAULT_AUTO_FIELD to AutoField in AuthtoolsConfig (#123) - Silences warning and prevents new migrations when using authtools with Django >= 3.2
Normalize email in User clean method and UserManager get_by_natural_key method (weslord #112) - Fixes a bug where email would not be normalized when creating a user in the admin
Migrate from TravisCI to GitHub Actions
1.7.0 (2019-06-26)
Fix bug when using Django 1.11 where resetting a password when already logged in as another user caused an error
Remove support for Django versions below 1.11 and Python below 2.7 and 3.6
1.6.0 (2017-06-14)
Add support for Django 1.9, 1.10, 1.11 (Jared Proffitt #82)
Remove old conditional imports dating as far back as Django 1.5
Update readme
1.5.0 (2016-03-26)
Update various help_text fields to match Django 1.9 (Wenze van Klink #51, Gavin Wahl #64, Jared Proffitt #67, Ivan VenOsdel #69)
Documentation fixes (Yuki Izumi #52, Pi Delport #60, Germán Larraín #65)
Made case-insensitive tooling work with more than just USERNAME_FIELD=’username’ (Jared Proffitt, Rocky Meza #72, #73)
1.4.0 (2015-11-02)
Dropped Django 1.7 compatibility (Antoine Catton)
Add Django 1.8 compatibility (Antoine Catton, Gavin Wahl, #56)
Backwards Incompatible: Remove 1.6 URLs (Antoine Catton)
Backwards Incompatible: Remove view functions
1.3.0 (unreleased)
Added Django 1.7 compatibility (Antoine Catton, Rocky Meza, #35)
LoginView.disallow_authenticated was changed to LoginView.allow_authenticated
LoginView.disallow_authenticated was deprecated.
Backwards Incompatible: LoginView.allow_authenticated is now True by default (which is the default behavior in Django)
Create migrations for authtools.
If updating from an older authtools, these migrations must be run on your apps:
$ python manage.py migrate --fake authtools 0001_initial $ python manage.py migrate
1.2.0 (2015-04-02)
Add CaseInsensitiveEmailUserCreationForm for creating users with lowercased email address usernames (Bradley Gordon, #31, #11)
Add CaseInsensitiveEmailBackendMixin, CaseInsensitiveEmailModelBackend for authenticating case-insensitive email address usernames (Bradley Gordon, #31, #11)
Add tox support for test running (Piper Merriam, #25)
1.1.0 (2015-02-24)
PasswordChangeView now handles a next URL parameter (#24)
1.0.0 (released August 16, 2014)
Add friendly_password_reset view and FriendlyPasswordResetForm (Antoine Catton, #18)
Bugfix Allow LOGIN_REDIRECT_URL to be unicode (Alan Johnson, Gavin Wahl, Rocky Meza, #13)
Backwards Incompatible Dropped support for Python 3.2
0.2.2 (released July 21, 2014)
Update safe urls in tests
Give the ability to restrain which users can reset their password
Add send_mail to AbstractEmailUser. (Jorge C. Leitão)
0.2.1
Bugfix: UserAdmin was expecting a User with a name field.
0.2.0
Django 1.6 support.
Django 1.6 broke backwards compatibility of the password_reset_confirm view. Be sure to update any references to this URL. Rather than using a separate view for each encoding, authtools uses a single view that works with both.
Bugfix: if LOGIN_URL was a URL name, it wasn’t being reversed in the PasswordResetConfirmView.
0.1.2 (released July 01, 2013)
Use prefetch_related in the UserChangeForm to avoid doing hundreds of ContentType queries. The form from Django has the same feature, it wasn’t copied over correctly in our original form.
0.1.1 (released May 30, 2013)
some bugfixes:
Call UserManager.normalize_email on an instance, not a class.
authtools.models.User should inherit its parent’s Meta.
0.1.0 (released May 28, 2013)
django-authtools
Metadata
Release files for django-authtools 2.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| django_authtools-2.1.0.tar.gz | 40.0 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| django_authtools-2.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 54.3 kB
Release files / django_authtools-2.1.0.tar.gz
| Download URL | django_authtools-2.1.0.tar.gz |
|---|---|
| Size | 40.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e51d0832a5e93361a09902ce99f57996e60ebd563629461fa5eb2b858db7bf7f
|
|
BLAKE2b-256 checksum How to use checksums |
5d2ec67b9d5cf581e5730ee2681e5e68e702284d6017daa32507c54716d7a9ef
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.7
|
Release files / django_authtools-2.1.0-py3-none-any.whl
| Download URL | django_authtools-2.1.0-py3-none-any.whl |
|---|---|
| Size | 14.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2d0c63d252583959a194ae7e560353ccd8ef8c3f76ab361f14f03a3cbff0b831
|
|
BLAKE2b-256 checksum How to use checksums |
ae6e0fb0bfacb686ebe7410e12f83a56563c95b9dcd4a1c823d37247bc9cc1e6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.7
|
Security for django-authtools 2.1.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.