Могу ли я изменить поле auth_user.username в Django на 100 символов, ничего не нарушая?

Прежде чем кто-нибудь пометит этот вопрос как дубликат этого вопроса Может ли имя auth_user.username django быть varchar (75)? Как это можно сделать? или другие подобные вопросы по SO, прочтите этот вопрос. Вопрос, который я связал, точно задает этот вопрос, но, к сожалению, ответы не касаются заданного вопроса.

Могу ли я изменить длину поля auth_user.username на 100 символов, выполнив следующие действия:

  1. Запустить ALTER table в БД для поля имени пользователя
  2. Измените max_length здесь: username = models.CharField(_('username'), max_length=30, unique=True, help_text=_("Required. 30 characters or fewer. Letters, numbers and @/./+/-/_ characters"))

Сломал бы я что-нибудь в Django, если бы я это сделал?

То, что это сломается, когда я обновлю Django до более поздней версии, не проблема. Я также не собираюсь писать другие методы аутентификации, я просто хочу знать, сломаю ли я что-нибудь, если сделаю это.


person Arpit Rai    schedule 28.01.2011    source источник
comment
stackoverflow.com/questions/2610088/   -  person Gordon Wrigley    schedule 08.08.2012
comment
@tolomea OP уже опубликовал эту ссылку и прочитал ее.   -  person user    schedule 08.06.2014


Ответы (7)


Вам нужно обезопасить max-length в нескольких местах: описание поля модели, описание поля формы и валидаторы максимальной длины. Валидаторы максимальной длины прикрепляются как к полям формы, так и к полям модели.

Вот фрагмент кода, который исправит все:

https://gist.github.com/1143957 (проверено с django 1.2 и 1.3)

Обновление: хорошие новости! Начиная с django 1.5 вы можете переопределить модель пользователя: Настройка модели пользователя

person Ski    schedule 28.01.2011
comment
+1 Хороший. В другом сообщении объясняется этот процесс, но не как вам придется переопределить проверку форм django по умолчанию. - person Yuji 'Tomita' Tomita; 28.01.2011
comment
Кроме того, я добавил 3 строки, позволяющие пользователям регистрироваться с 75 символами: from django.contrib.auth.models import User User._meta.get_field_by_name ('username') [0] .max_length = 75 User._meta.get_field ('username' ) .validators [0] .limit_value = 75 - person Thomas; 13.08.2011

В этом нет ничего плохого. Просто измените длину в модели и в базе :)

person Tommaso Barbugli    schedule 28.01.2011

Создайте модель профиля пользователя, добавьте туда свое очень длинное имя пользователя и используйте его. Конечно, это делает поле подлинного имени пользователя бесполезным, но это намного лучше, чем взлом кода Django, который доставит вам неприятности, когда вам нужно его обновить.

person shanyu    schedule 28.01.2011
comment
Спасибо, но я не это ищу. :) - person Arpit Rai; 29.01.2011

Для меня приведенный ниже код работает и хорошо прост.

from django.contrib.auth.models import AbstractUser

class MyUser(AbstractUser):
    ....
    # your custom fields

MyUser._meta.get_field('username').max_length = 255  # or 100

после того, как вы сможете запустить миграцию

person Mateus Padua    schedule 21.10.2014
comment
Это должен быть принятый ответ для django ›= 1.7 - person Dunkelstern; 27.07.2016

Если вы измените базу данных вручную, а также модель, то проблем возникнуть не должно.

Вы также можете вернуться в противном случае, и я бы сказал, сделайте резервную копию на всякий случай, но я не уверен, что это даже необходимо

person zenna    schedule 28.01.2011

для будущих нужд это лучший и самый простой способ узнать:

https://github.com/GoodCloud/django-longer-username

person pedrotorres    schedule 10.10.2013

Другое решение - изменить код аутентификации. Когда новый пользователь регистрируется, он вводит адрес электронной почты, вы сохраняете его в поле электронной почты, чтобы оно было у вас, а если его адрес электронной почты превышает 30 символов, вы сокращаете его, прежде чем помещать в поле пользователя. Затем измените аутентификацию для входа в систему для новых учетных записей.

person Pstrazzulla    schedule 16.09.2014