2009-05-22 3 views
11

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

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

Раньше я использовал пользовательское приложение django для добавления профиля к пользователю, но на этот раз я предпочел бы сделать класс немым. Но я все еще хочу использовать класс User, так как он дает мне простой способ ограничить части сайта только для зарегистрированных пользователей.

Как это сделать?

ответ

8

Вместо того, чтобы модифицировать пользовательский класс напрямую или выполнять подклассификацию, вы можете просто перепрофилировать существующие поля.

Для одного сайта я использовал поле «first_name» как «публично отображаемое имя» пользователя и добавил его в поле «имя пользователя» (для использования в URL-адресах). Я написал собственный сервер аутентификации, чтобы люди могли войти в систему, используя свое «публичное имя» или их адрес электронной почты, и я соблюдаю уникальность обоих из них во время регистрации. Это хорошо работает с другими приложениями многократного использования и не вводит дополнительные таблицы или запросы.

Для другого сайта я не хотел, чтобы имена пользователей вообще были уникальными. Чтобы удовлетворить потребность Django в уникальном имени пользователя, я просто испортил адрес электронной почты и использовал это как имя пользователя (вы должны base64-кодировать хэш, чтобы сжать его до 30 символов). Пользовательский auth backend, чтобы разрешить вход с помощью электронной почты.

Если обратная совместимость не была проблемой, есть много улучшений, которые мне бы хотелось увидеть в django.contrib.auth и модели User, чтобы сделать их более гибкими. Но в текущих ограничениях вы можете многое сделать с небольшим творчеством.

+0

Любая идея, как построить auth backend для входа в систему с помощью электронной почты? – kender

+0

Ознакомьтесь с этим фрагментом, чтобы начать работу: http://www.djangosnippets.org/snippets/74/ Обязательно прочитайте комментарии, так как код во втором комментарии лучше, чем во фрагменте, и много другие важные вопросы возникают в комментариях, которые вы хотите иметь в виду. –

7

Модель пользователя Django структурирована очень разумно. Вы действительно не хотите разрешать произвольные символы в имени пользователя, например, и есть способы достижения email address login, без взлома изменений базовой модели.

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

Если вы хотите на самом деле изменить основную модель пользователя, но также и «играть хорошо» с многоразовыми приложениями, которые полагаются на нее, вы открываете немного ящика Пандоры. Разработчики делают базовые предположения о том, как структурирована основная библиотека, поэтому любые изменения могут привести к неожиданному поломке. Тем не менее, вы можете изменить monkeypatch в базовую модель или поместить копию Django локально. Я бы отговорил последнего и рекомендую только первое, если вы знаете, что делаете.

+6

Пользовательская модель Django структурирована «разумно» в том случае, если вы строили сайт, это была бы разумная модель пользователя для определенного набора потребностей. Но в качестве основной абстракции пользователя для фреймворка он оставляет желать некоторой гибкости. –

+2

Я согласен с тем, что более привлекательная система auth была бы желательна –

7

Я неправильно понял вопрос. Надеюсь, что этот пост полезен для кого-то еще.

#in models.py 
from django.db.models.signals import post_save 

class UserProfile(models.Model): 
    user = models.ForeignKey(User) 
    #other fields here 

    def __str__(self): 
      return "%s's profile" % self.user 

    def create_user_profile(sender, instance, created, **kwargs): 
     if created: 
      profile, created = UserProfile.objects.get_or_create(user=instance) 

post_save.connect(create_user_profile, sender=User) 

#in settings.py 
AUTH_PROFILE_MODULE = 'YOURAPP.UserProfile' 

Это создаст Userprofile каждый раз, когда пользователь будет сохранен, если он будет создан. Вы можете использовать

user.get_profile().whatever 

Вот еще информация из документации

http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

0

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

  1. Изменить сама User модель, согласно предложениям Даниила
  2. Написать CustomUser класс, подклассы User или копируя его функциональность.

Последнее предложение означает, что вы должны реализовать некоторые вещи, которые User делает автоматически вручную, но интересно ли это так же плохо, как это звучит, особенно если вы в начале вашего проекта. Все, что вам нужно сделать, это переписать средний класс и некоторые декораторы.

Конечно, я не думаю, что это купит вам все, что вам не поможет, за исключением того, что ваш проект не должен ломаться, если вы svn update своим джанго. Это может избежать некоторых проблем совместимости с другими приложениями, но, по моему мнению, большинство проблем будет существовать в любом случае.

0

Существует несколько способов сделать это, но вот что я хотел бы сделать: я бы разрешил пользователю вводить электронное письмо, имя пользователя (которое должно содержать хотя бы одну букву и символы @) или номер мобильного телефона. Затем, когда я его проверю:

  1. Проверьте наличие @. Если это так, установите его как адрес электронной почты пользователя, хеш его соответствующим образом и установите его как свое имя пользователя.
  2. Проверьте, есть ли только цифры, тире и +. Затем разделите соответствующие символы и сохраните их как номер мобильного телефона, так и имя пользователя (если вы храните мобильный номер в другой модели для целей SMS или что-то еще).
  3. Если это не так, просто укажите его как имя пользователя.

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

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