Assargin
@Assargin
Перед ответом смотрю наличие ✔ в ваших вопросах

Как изменить регулярку, по которой проверяется username при редактировании пользователя в админке в Django?

Задача такая: нужно разрешить использование в имени пользователя пробелов, так как при социальной авторизации создается пользователь с ником типа "Иван Иванов", но отредактировать его впоследствии не получается, при сохранении формы ругается - "Это значение может состоять из букв, цифр и знаков @/./+/-/_.".
Везде в интернете даётся примерно один и тот же рецепт: создать свои формы добавления и редактирования пользователя, и свой 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, мой стаж - почти полгода
  • Вопрос задан
  • 3029 просмотров
Решения вопроса 1
crazyzubr
@crazyzubr
Python backend-developer
Видимо срабатывает еще валидатор при сохранении в самой модели User

Соответственно, решением может быть создании собственно модели юзера, наследуя абстракную стандартную модель и переопределении валидаторов поля username в ней.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы