Задача такая: нужно разрешить использование в имени пользователя пробелов, так как при социальной авторизации создается пользователь с ником типа "Иван Иванов", но отредактировать его впоследствии не получается, при сохранении формы ругается - "Это значение может состоять из букв, цифр и знаков @/./+/-/_.".
Везде в интернете даётся примерно один и тот же рецепт: создать свои формы добавления и редактирования пользователя, и свой UserAdmin, и перерегистрировать его.
Ну что же, сделал вот так, в своём admin.py:
username_regex_field = forms.RegexField(
label=_("Username"),
max_length=30,
regex=r'^[\ \w.@+-]+$',
help_text=_("Required. 30 characters or fewer. Letters, digits and "
"@/./+/-/_ only."),
error_messages={
'invalid': _("This value may contain only letters, numbers and "
"@/./+/-/_ characters.")})
class MyUserCreationForm(UserCreationForm):
username = username_regex_field
class MyUserChangeForm(UserChangeForm):
username = username_regex_field
class MyUserAdmin(UserAdmin):
add_form = MyUserCreationForm
form = MyUserChangeForm
admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)
Это минимальный, но рабочий код.
Но задачу он не решает. При отладке выяснилось, что при валидации формы, в классе django.core.validators.RegexValidator проверяется имя пользователя сначала по моей регулярке (проверка проходит успешно), а потом по исходной джанговской (само собой, не проходит)! Не понимаю, откуда берётся старая регулярка, если я переопределил форму и поле в ней.
Всяко пробовал уже: и код исходного класса целиком копировал, меняя только имя, класс-предок, и нужные мне регулярки - все равно не работает. Притом везде, где в интернете приводится этот способ, везде никаких комментариев нет, на тему что оно не работает.
Используется Django 1.6.5, мой стаж - почти полгода