diff --git a/CHANGELOG.md b/CHANGELOG.md
index e614c84a..14fa97d5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,22 @@
All enhancements and patches to Cookiecutter Django will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/).
+##[2016-09-28]
+### Added
+- Added add default `AUTH_PASSWORD_VALIDATORS` configuration, generated by django 1.10 startproject. See (Password Validation docs)[https://docs.djangoproject.com/en/1.10/topics/auth/passwords/#module-django.contrib.auth.password_validation] (@luzfcb)
+- Rename `MIDDLEWARE_CLASSES` to `MIDDLEWARE` to enable support to [new style middleware](https://github.com/django/deps/blob/master/final/0005-improved-middleware.rst) introduced in Django 1.10 (@luzfcb)
+### Changed
+- Upgrade to Django 1.10.1 (@luzfcb)
+- Upgrade django-model-utils to 2.6, django-redis to 4.5.0, redis to 2.10.5, Sphinx to 1.4.6, pytest-django to 3.0.0, django-anymail to 0.5, raven to 5.27.1 (@luzfcb)
+- Upgrade to Bootstrap 4 Alpha 4, jQuery to 3.1.1, tether.js to 1.3.7 (@luzfcb)
+- Update `manage.py` to use same code of `manage.py` from Django 1.10 (@luzfcb)
+- Sync `sites` app migrations with django 1.10, and fix aditional migrations to `sites` and `user` app (@luzfcb)
+d changed 'admin' url on `config/urls.py`, to stay the same as generated by django 1.10 (@luzfcb)
+- Make test_docker.sh tests pass by passing new password auth rules (@ssteinerx)
+### Removed
+- Removed django-autoslug because not support django 1.10 at this date (@luzfcb)
+
+
##[2016-09-10]
### Changed
- Use app registry instead of INSTALLED_APPS to discover celery tasks (@dhepper)
diff --git a/README.rst b/README.rst
index b129a215..e9980f7b 100644
--- a/README.rst
+++ b/README.rst
@@ -26,9 +26,9 @@ Powered by Cookiecutter_, Cookiecutter Django is a framework for jumpstarting pr
Features
---------
-* For Django 1.9
+* For Django 1.10
* Renders Django projects with 100% starting test coverage
-* Twitter Bootstrap_ v4.0.0 - `alpha 3`_
+* Twitter Bootstrap_ v4.0.0 - `alpha 4`_
* 12-Factor_ based settings via django-environ_
* Optimized development and production settings
* Registration via django-allauth_
@@ -56,7 +56,7 @@ Optional Integrations
* Integration with Sentry_ for error logging
* Integration with Opbeat_ for performance monitoring
-.. _`alpha 3`: http://blog.getbootstrap.com/2016/07/27/bootstrap-4-alpha-3/
+.. _`alpha 4`: http://blog.getbootstrap.com/2016/09/05/bootstrap-4-alpha-4/
.. _Bootstrap: https://github.com/twbs/bootstrap
.. _django-environ: https://github.com/joke2k/django-environ
.. _12-Factor: http://12factor.net/
diff --git a/docs/faq.rst b/docs/faq.rst
index 854e9ddd..def4ba1f 100644
--- a/docs/faq.rst
+++ b/docs/faq.rst
@@ -8,9 +8,9 @@ Why is there a django.contrib.sites directory in Cookiecutter Django?
It is there to add a migration so you don't have to manually change the ``sites.Site`` record from ``example.com`` to whatever your domain is. Instead, your ``{{cookiecutter.domain_name}}`` and {{cookiecutter.project_name}} value is placed by **Cookiecutter** in the domain and name fields respectively.
-See `0002_set_site_domain_and_name.py`_.
+See `0003_set_site_domain_and_name.py`_.
-.. _`0002_set_site_domain_and_name.py`: https://github.com/pydanny/cookiecutter-django/blob/master/%7B%7Bcookiecutter.project_slug%7D%7D/%7B%7Bcookiecutter.project_slug%7D%7D/contrib/sites/migrations/0002_set_site_domain_and_name.py
+.. _`0003_set_site_domain_and_name.py`: https://github.com/pydanny/cookiecutter-django/blob/master/%7B%7Bcookiecutter.project_slug%7D%7D/%7B%7Bcookiecutter.project_slug%7D%7D/contrib/sites/migrations/0003_set_site_domain_and_name.py
Why aren't you using just one configuration file (12-Factor App)
diff --git a/requirements_to_watch.txt b/requirements_to_watch.txt
index 3e25cb20..34f0fe62 100644
--- a/requirements_to_watch.txt
+++ b/requirements_to_watch.txt
@@ -1,2 +1,4 @@
# These requirements prevented an upgrade to Django 1.10.
django-coverage-plugin==1.3.1
+django-autoslug==1.9.3
+
diff --git a/setup.py b/setup.py
index 30df6fdd..a20a28b2 100644
--- a/setup.py
+++ b/setup.py
@@ -10,7 +10,7 @@ except ImportError:
# Our version ALWAYS matches the version of Django we support
# If Django has a new release, we branch, tag, then update this setting after the tag.
-version = '1.9.9-05'
+version = '1.10.1'
if sys.argv[-1] == 'tag':
os.system('git tag -a %s -m "version %s"' % (version, version))
@@ -34,7 +34,7 @@ setup(
classifiers=[
'Development Status :: 4 - Beta',
'Environment :: Console',
- 'Framework :: Django :: 1.9',
+ 'Framework :: Django :: 1.10',
'Intended Audience :: Developers',
'Natural Language :: English',
'License :: OSI Approved :: BSD License',
diff --git a/tests/test_cookiecutter_generation.py b/tests/test_cookiecutter_generation.py
old mode 100644
new mode 100755
diff --git a/tests/test_docker.sh b/tests/test_docker.sh
old mode 100644
new mode 100755
diff --git a/{{cookiecutter.project_slug}}/config/settings/common.py b/{{cookiecutter.project_slug}}/config/settings/common.py
index c9433416..04998575 100644
--- a/{{cookiecutter.project_slug}}/config/settings/common.py
+++ b/{{cookiecutter.project_slug}}/config/settings/common.py
@@ -53,7 +53,7 @@ INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS
# MIDDLEWARE CONFIGURATION
# ------------------------------------------------------------------------------
-MIDDLEWARE_CLASSES = (
+MIDDLEWARE = (
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
@@ -200,6 +200,26 @@ ROOT_URLCONF = 'config.urls'
# See: https://docs.djangoproject.com/en/dev/ref/settings/#wsgi-application
WSGI_APPLICATION = 'config.wsgi.application'
+
+# PASSWORD VALIDATION
+# https://docs.djangoproject.com/en/dev/ref/settings/#auth-password-validators
+# ------------------------------------------------------------------------------
+
+AUTH_PASSWORD_VALIDATORS = [
+ {
+ 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
+ },
+]
+
# AUTHENTICATION CONFIGURATION
# ------------------------------------------------------------------------------
AUTHENTICATION_BACKENDS = (
diff --git a/{{cookiecutter.project_slug}}/config/settings/local.py b/{{cookiecutter.project_slug}}/config/settings/local.py
index e6fd99f8..c72d3af1 100644
--- a/{{cookiecutter.project_slug}}/config/settings/local.py
+++ b/{{cookiecutter.project_slug}}/config/settings/local.py
@@ -50,7 +50,7 @@ CACHES = {
# django-debug-toolbar
# ------------------------------------------------------------------------------
-MIDDLEWARE_CLASSES += ('debug_toolbar.middleware.DebugToolbarMiddleware',)
+MIDDLEWARE += ('debug_toolbar.middleware.DebugToolbarMiddleware',)
INSTALLED_APPS += ('debug_toolbar', )
INTERNAL_IPS = ['127.0.0.1', '10.0.2.2', ]
diff --git a/{{cookiecutter.project_slug}}/config/settings/production.py b/{{cookiecutter.project_slug}}/config/settings/production.py
index ebfcc765..4df16821 100644
--- a/{{cookiecutter.project_slug}}/config/settings/production.py
+++ b/{{cookiecutter.project_slug}}/config/settings/production.py
@@ -42,11 +42,11 @@ INSTALLED_APPS += ('raven.contrib.django.raven_compat', )
# Use Whitenoise to serve static files
# See: https://whitenoise.readthedocs.io/
WHITENOISE_MIDDLEWARE = ('whitenoise.middleware.WhiteNoiseMiddleware', )
-MIDDLEWARE_CLASSES = WHITENOISE_MIDDLEWARE + MIDDLEWARE_CLASSES
+MIDDLEWARE = WHITENOISE_MIDDLEWARE + MIDDLEWARE
{% endif %}
{%- if cookiecutter.use_sentry_for_error_reporting == 'y' -%}
RAVEN_MIDDLEWARE = ('raven.contrib.django.raven_compat.middleware.SentryResponseErrorIdMiddleware', )
-MIDDLEWARE_CLASSES = RAVEN_MIDDLEWARE + MIDDLEWARE_CLASSES
+MIDDLEWARE = RAVEN_MIDDLEWARE + MIDDLEWARE
{% endif %}
{%- if cookiecutter.use_opbeat == 'y' -%}
# opbeat integration
@@ -57,9 +57,9 @@ OPBEAT = {
'APP_ID': env('DJANGO_OPBEAT_APP_ID'),
'SECRET_TOKEN': env('DJANGO_OPBEAT_SECRET_TOKEN')
}
-MIDDLEWARE_CLASSES = (
+MIDDLEWARE = (
'opbeat.contrib.django.middleware.OpbeatAPMMiddleware',
-) + MIDDLEWARE_CLASSES
+) + MIDDLEWARE
{% endif %}
# SECURITY CONFIGURATION
diff --git a/{{cookiecutter.project_slug}}/config/urls.py b/{{cookiecutter.project_slug}}/config/urls.py
index f3a62112..cbb977ff 100644
--- a/{{cookiecutter.project_slug}}/config/urls.py
+++ b/{{cookiecutter.project_slug}}/config/urls.py
@@ -13,7 +13,7 @@ urlpatterns = [
url(r'^about/$', TemplateView.as_view(template_name='pages/about.html'), name='about'),
# Django Admin, use {% raw %}{% url 'admin:index' %}{% endraw %}
- url(settings.ADMIN_URL, include(admin.site.urls)),
+ url(settings.ADMIN_URL, admin.site.urls),
# User management
url(r'^users/', include('{{ cookiecutter.project_slug }}.users.urls', namespace='users')),
diff --git a/{{cookiecutter.project_slug}}/manage.py b/{{cookiecutter.project_slug}}/manage.py
index b41522c7..9de71376 100755
--- a/{{cookiecutter.project_slug}}/manage.py
+++ b/{{cookiecutter.project_slug}}/manage.py
@@ -5,6 +5,19 @@ import sys
if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.local')
- from django.core.management import execute_from_command_line
-
+ try:
+ from django.core.management import execute_from_command_line
+ except ImportError:
+ # The above import may fail for some other reason. Ensure that the
+ # issue is really that Django is missing to avoid masking other
+ # exceptions on Python 2.
+ try:
+ import django # noqa
+ except ImportError:
+ raise ImportError(
+ "Couldn't import Django. Are you sure it's installed and "
+ "available on your PYTHONPATH environment variable? Did you "
+ "forget to activate a virtual environment?"
+ )
+ raise
execute_from_command_line(sys.argv)
diff --git a/{{cookiecutter.project_slug}}/requirements/base.txt b/{{cookiecutter.project_slug}}/requirements/base.txt
index fcc10ba2..b2abd4ed 100644
--- a/{{cookiecutter.project_slug}}/requirements/base.txt
+++ b/{{cookiecutter.project_slug}}/requirements/base.txt
@@ -7,12 +7,12 @@ wheel==0.29.0
{%- endif %}
# Bleeding edge Django
-django==1.9.9
+django==1.10.1
# Configuration
django-environ==0.4.0
{% if cookiecutter.use_whitenoise == 'y' -%}
-whitenoise==3.2.1
+whitenoise==3.2.2
{%- endif %}
@@ -40,14 +40,13 @@ psycopg2==2.6.2
# Unicode slugification
awesome-slugify==1.6.5
-django-autoslug==1.9.3
# Time zones support
pytz==2016.6.1
# Redis support
-django-redis==4.4.4
-redis>=2.10.0
+django-redis==4.5.0
+redis>=2.10.5
{% if cookiecutter.use_celery == "y" %}
celery==3.1.23
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/0001_initial.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/0001_initial.py
index 555d02c4..b1803682 100644
--- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/0001_initial.py
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/0001_initial.py
@@ -1,31 +1,34 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
-from django.db import models, migrations
import django.contrib.sites.models
+from django.contrib.sites.models import _simple_domain_name_validator
+from django.db import migrations, models
class Migration(migrations.Migration):
- dependencies = [
- ]
+ dependencies = []
operations = [
migrations.CreateModel(
name='Site',
fields=[
- ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
- ('domain', models.CharField(verbose_name='domain name', max_length=100, validators=[django.contrib.sites.models._simple_domain_name_validator])),
- ('name', models.CharField(verbose_name='display name', max_length=50)),
+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+ ('domain', models.CharField(
+ max_length=100, verbose_name='domain name', validators=[_simple_domain_name_validator]
+ )),
+ ('name', models.CharField(max_length=50, verbose_name='display name')),
],
options={
- 'verbose_name_plural': 'sites',
- 'verbose_name': 'site',
- 'db_table': 'django_site',
'ordering': ('domain',),
+ 'db_table': 'django_site',
+ 'verbose_name': 'site',
+ 'verbose_name_plural': 'sites',
},
+ bases=(models.Model,),
managers=[
- (b'objects', django.contrib.sites.models.SiteManager()),
+ ('objects', django.contrib.sites.models.SiteManager()),
],
),
]
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/0002_alter_domain_unique.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/0002_alter_domain_unique.py
new file mode 100644
index 00000000..468718cd
--- /dev/null
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/0002_alter_domain_unique.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+import django.contrib.sites.models
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('sites', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='site',
+ name='domain',
+ field=models.CharField(
+ max_length=100, unique=True, validators=[django.contrib.sites.models._simple_domain_name_validator],
+ verbose_name='domain name'
+ ),
+ ),
+ ]
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/0002_set_site_domain_and_name.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/0003_set_site_domain_and_name.py
similarity index 96%
rename from {{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/0002_set_site_domain_and_name.py
rename to {{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/0003_set_site_domain_and_name.py
index e6292f0b..348989e1 100644
--- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/0002_set_site_domain_and_name.py
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/contrib/sites/migrations/0003_set_site_domain_and_name.py
@@ -38,7 +38,7 @@ def update_site_backward(apps, schema_editor):
class Migration(migrations.Migration):
dependencies = [
- ('sites', '0001_initial'),
+ ('sites', '0002_alter_domain_unique'),
]
operations = [
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/templates/base.html b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/templates/base.html
index 3518fe6e..e816a208 100644
--- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/templates/base.html
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/templates/base.html
@@ -14,8 +14,8 @@
{% block css %}
-
-
+
+
{% endraw %}{% if cookiecutter.use_compressor == "y" %}{% raw %}{% compress css %}{% endraw %}{% endif %}{% raw %}
@@ -89,10 +89,10 @@
================================================== -->
{% block javascript %}
-
-
-
-
+
+
+
+
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/migrations/0001_initial.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/migrations/0001_initial.py
index 8327d289..e76c333f 100644
--- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/migrations/0001_initial.py
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/migrations/0001_initial.py
@@ -1,44 +1,47 @@
# -*- coding: utf-8 -*-
+# Generated by Django 1.10.1 on 2016-09-23 04:36
from __future__ import unicode_literals
-from django.db import models, migrations
-import django.utils.timezone
import django.contrib.auth.models
-import django.core.validators
+import django.contrib.auth.validators
+from django.db import migrations, models
+import django.utils.timezone
class Migration(migrations.Migration):
+ initial = True
+
dependencies = [
- ('auth', '0006_require_contenttypes_0002'),
+ ('auth', '0008_alter_user_username_max_length'),
]
operations = [
migrations.CreateModel(
name='User',
fields=[
- ('id', models.AutoField(primary_key=True, verbose_name='ID', serialize=False, auto_created=True)),
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=128, verbose_name='password')),
- ('last_login', models.DateTimeField(null=True, verbose_name='last login', blank=True)),
- ('is_superuser', models.BooleanField(help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status', default=False)),
- ('username', models.CharField(max_length=30, validators=[django.core.validators.RegexValidator('^[\\w.@+-]+$', 'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.', 'invalid')], verbose_name='username', error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.', unique=True)),
- ('first_name', models.CharField(max_length=30, verbose_name='first name', blank=True)),
- ('last_name', models.CharField(max_length=30, verbose_name='last name', blank=True)),
- ('email', models.EmailField(max_length=254, verbose_name='email address', blank=True)),
- ('is_staff', models.BooleanField(help_text='Designates whether the user can log into this admin site.', verbose_name='staff status', default=False)),
- ('is_active', models.BooleanField(help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active', default=True)),
- ('date_joined', models.DateTimeField(verbose_name='date joined', default=django.utils.timezone.now)),
- ('groups', models.ManyToManyField(related_name='user_set', blank=True, verbose_name='groups', to='auth.Group', help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_query_name='user')),
- ('user_permissions', models.ManyToManyField(related_name='user_set', blank=True, verbose_name='user permissions', to='auth.Permission', help_text='Specific permissions for this user.', related_query_name='user')),
- ('name', models.CharField(max_length=255, verbose_name='Name of User', blank=True)),
+ ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
+ ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
+ ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
+ ('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')),
+ ('last_name', models.CharField(blank=True, max_length=30, verbose_name='last name')),
+ ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
+ ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
+ ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
+ ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
+ ('name', models.CharField(blank=True, max_length=255, verbose_name='Name of User')),
+ ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
+ ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
],
options={
+ 'verbose_name_plural': 'users',
'verbose_name': 'user',
'abstract': False,
- 'verbose_name_plural': 'users',
},
managers=[
- (b'objects', django.contrib.auth.models.UserManager()),
+ ('objects', django.contrib.auth.models.UserManager()),
],
),
]
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_admin.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_admin.py
index 10b07b74..a1ff0b84 100644
--- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_admin.py
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_admin.py
@@ -6,14 +6,14 @@ from ..admin import MyUserCreationForm
class TestMyUserCreationForm(TestCase):
def setUp(self):
- self.user = self.make_user()
+ self.user = self.make_user('notalamode', 'notalamodespassword')
def test_clean_username_success(self):
# Instantiate the form with a new username
form = MyUserCreationForm({
'username': 'alamode',
- 'password1': '123456',
- 'password2': '123456',
+ 'password1': '7jefB#f@Cc7YJB]2v',
+ 'password2': '7jefB#f@Cc7YJB]2v',
})
# Run is_valid() to trigger the validation
valid = form.is_valid()
@@ -27,8 +27,8 @@ class TestMyUserCreationForm(TestCase):
# Instantiate the form with the same username as self.user
form = MyUserCreationForm({
'username': self.user.username,
- 'password1': '123456',
- 'password2': '123456',
+ 'password1': 'notalamodespassword',
+ 'password2': 'notalamodespassword',
})
# Run is_valid() to trigger the validation, which is going to fail
# because the username is already taken