2014-10-16 3 views
5

Я хочу, чтобы увеличить длину имени пользователя в Джанго от 30 до около 80, я знаю, что это может быть дубликатом вопрос, но предыдущие ответы не работают, например https://kfalck.net/2010/12/30/longer-usernames-for-djangoLonger имя пользователя в Django 1.7

это для Django 1.2.

ли кто-нибудь попробовать подобный хак для Джанго> 1,5 Заранее спасибо

ответ

0

В Django 1.5 и выше, рекомендуемый подход должен был бы создать custom user model. Затем вы можете сделать поле имени пользователя точно так, как хотите.

+0

Помимо использования пользовательской пользовательской модели, есть ли способ сделать это? – vaibhav1312

+0

Я не могу придумать лучшего подхода. У другого есть другой ответ. – Alasdair

0

У меня была такая же проблема несколько дней назад. Наконец, я закончил просто отключить первые 30 символов (старого) имени пользователя (в новой таблице базы данных) и добавить собственный сервер аутентификации, который будет проверять электронную почту вместо имени пользователя. Ужасный хак, который я знаю, и я планирую исправить это, как только у меня будет время. Идея следующая:

У меня уже есть класс модели, который имеет взаимно-однозначное отношение с djangos auth.User. Я добавлю другое поле, которое называется full_username.

class MyCustomUserModel(models.Model): 
    user = models.OneToOneField(
      settings.AUTH_USER_MODEL, related_name="custom_user") 
    full_username = models.CharField(max_length=80, ...) 
    ... 

Затем я добавлю другой пользовательский сервер аутентификации, который будет проверять это поле как имя пользователя. Это будет выглядеть примерно так:

from django.contrib.auth.backends import ModelBackend 

class FullUsernameAuthBackend(ModelBackend): 
    def authenticate(self, username=None, password=None, **kwargs): 
     UserModel = get_user_model() 
     if username is None: 
      username = kwargs.get(UserModel.USERNAME_FIELD) 

     try: 
      user = UserModel._default_manager.filter(custom_user__full_username=username) 
      # If this doesn't work, will use (the second case): 
      # user = MyCustomUserModel.objects.filter(full_username=username).user 
     if user.check_password(password): 
      return user 
    except UserModel.DoesNotExist: 
     # Adding exception MyCustomUserModel.DoesNotExist in "(the second case)" 
     # Run the default password hasher once to reduce the timing 
     # difference between an existing and a non-existing user (#20760). 
     UserModel().set_password(password) 

После этого, вам необходимо изменить settings.py:

AUTHENTICATION_BACKENDS = (
    "....FullUsernameAuthBackend", 
    # I will have the email auth backend here also. 
) 

Я надеюсь, что он будет работать.

+0

Замечание 'AUTHENTICATION_BACKENDS = (', поэтому исходный бэкенд django не должен использоваться (и auth.User.username в этом случае не учитывается при входе в систему). –

+0

Фактически я принимал электронную почту от пользователя в качестве имени пользователя и сохранял его в как поле имени пользователя, так и поле электронной почты, и использовало систему аутентификации по умолчанию. Спасибо за ваш ответ. – vaibhav1312

0

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

migrations.RunSQL("alter table auth_user alter column username type varchar(254);")

+0

Как бы вы перешли к переопределению авторизации формы auth_user? –

Смежные вопросы