Как изменить модель пользователя django по умолчанию в соответствии с моими потребностями?

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

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

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

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

12 голосов | спросил kender 22 Mayam09 2009, 09:01:09

5 ответов


0

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

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

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

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

ответил Carl Meyer 22 Maypm09 2009, 18:59:04
0

Я неправильно понял вопрос. Надеюсь, этот пост будет полезен всем остальным.

#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'

Это создаст профайл пользователя при каждом сохранении пользователя, если он был создан. Затем вы можете использовать

  user.get_profile().whatever

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

http: //docs.djangoproject .com /о /DEV /темы /авториз /# хранение-дополнительная информация,-о-пользователи

ответил Raisins 22 Maypm09 2009, 17:47:00
0

Модель Django User структурирована очень разумно. Например, вы действительно не хотите разрешать произвольные символы в имени пользователя, и есть способы добиться адрес электронной почты для входа , без хакерских изменений базовой модели.

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

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

ответил Daniel Naab 22 Mayam09 2009, 11:59:39
0

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

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

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

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

ответил David Berger 22 Maypm09 2009, 18:09:53
0

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

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

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

ответил Adam Brenecki 11 +04002010-10-11T04:58:28+04:00312010bEurope/MoscowMon, 11 Oct 2010 04:58:28 +0400 2010, 04:58:28

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132