Qual é a melhor maneira de estender o modelo de usuário (fornecido com o aplicativo de autenticação do Django) com campos personalizados? Também gostaria de usar o email como nome de usuário (para fins de autenticação).
Eu já vi algumas maneiras de fazer isso, mas não consigo decidir qual é a melhor.
Respostas:
A maneira menos dolorosa e realmente recomendada pelo Django de fazer isso é através de uma
OneToOneField(User)
propriedade.Dito isto, estender
django.contrib.auth.models.User
e suplantar também funciona ...Eu definitivamente ficaria longe de mudar a classe User real na sua árvore de código-fonte do Django e / ou copiar e alterar o módulo de autenticação.
fonte
user = models.ForeignKey(User, unique=True)
é o mesmo queuser = models.OneToOneField(User)
? Eu acho que o efeito final é o mesmo? Mas talvez a implementação no back-end seja diferente.Nota: esta resposta está obsoleta. Veja outras respostas se você estiver usando o Django 1.7 ou posterior.
É assim que eu faço.
Isso criará um perfil de usuário sempre que um usuário for salvo, se ele for criado. Você pode então usar
Aqui estão mais algumas informações dos documentos
http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users
Atualização: observe que
AUTH_PROFILE_MODULE
está obsoleta desde a v1.5: https://docs.djangoproject.com/en/1.5/ref/settings/#auth-profile-modulefonte
user = models.ForeignKey( User )
e recuperar o objeto de perfil viauser.get_profile()
. Lembre-se defrom django.contrib.admin.models import User
.User
Bem, já passou algum tempo desde 2008 e é hora de receber uma nova resposta. Desde o Django 1.5, você poderá criar uma classe de usuário personalizada. Na verdade, no momento em que escrevo isso, ele já está mesclado no master, para que você possa experimentar.
Há algumas informações sobre isso nos documentos ou, se você quiser aprofundar, neste commit .
Tudo o que você precisa fazer é adicionar
AUTH_USER_MODEL
às configurações o caminho para a classe de usuário personalizada, que se estendeAbstractBaseUser
(versão mais personalizável) ouAbstractUser
(classe de usuário mais ou menos antiga que você pode estender).Para as pessoas com preguiça de clicar, aqui está um exemplo de código (extraído de documentos ):
fonte
email
é o nome de usuário.unique=True
ao campo email para deixarUSERNAME_FIELD
aceito-oDesde o Django 1.5, você pode facilmente estender o modelo do usuário e manter uma única tabela no banco de dados.
Você também deve configurá-lo como classe de usuário atual no seu arquivo de configurações
Se você deseja adicionar muitas preferências dos usuários, a opção OneToOneField pode ser uma opção melhor.
Uma observação para as pessoas que desenvolvem bibliotecas de terceiros: se você precisar acessar a classe de usuário, lembre-se de que as pessoas podem alterá-la. Use o ajudante oficial para obter a classe certa
fonte
django_social_auth
, eu recomendo usar um relacionamento OneToOne. NÃO use esse método, pois isso atrapalha suas migrações.django_social_auth
plugin e definir o AUTH_USER_MODEL para o usuário social de autenticação. Então, quando executei a migração do manage.py, atrapalhei meu aplicativo. Ao invés disso eu usei o modelo de usuário auth social como uma relação OneToOne s descritos aqui: stackoverflow.com/q/10638293/977116Changing this setting after you have tables created is not supported by makemigrations and will result in you having to manually write a set of migrations to fix your schema
Fonte: docs.djangoproject.com/en/dev/topics/auth/customizing/…Há uma recomendação oficial sobre o armazenamento de informações adicionais sobre os usuários . O Django Book também discute esse problema na seção Profiles .
fonte
O abaixo é outra abordagem para estender um usuário. Eu sinto que é mais claro, fácil, legível do que acima de duas abordagens.
http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/
Usando a abordagem acima:
fonte
Você pode simplesmente estender o perfil do usuário criando uma nova entrada sempre que um usuário for criado usando os sinais de pós-gravação do Django
models.py
Isso criará automaticamente uma instância de funcionário quando um novo usuário for criado.
Se você deseja estender o modelo do usuário e deseja adicionar mais informações ao criar um usuário, pode usar o django-betterforms ( http://django-betterforms.readthedocs.io/en/latest/multiform.html ). Isso criará um formulário de adição do usuário com todos os campos definidos no modelo UserProfile.
models.py
forms.py
views.py
addUser.html
urls.py
fonte
Estendendo o Django User Model (UserProfile) como um Pro
Achei isso muito útil: link
Um extrato:
de django.contrib.auth.models import User
fonte
Novo no Django 1.5, agora você pode criar seu próprio modelo de usuário personalizado (o que parece ser uma boa coisa a se fazer no caso acima). Consulte 'Personalizando a autenticação no Django'
Provavelmente, o novo recurso mais interessante da versão 1.5.
fonte
Isto é o que eu faço e, na minha opinião, é a maneira mais simples de fazer isso. defina um gerenciador de objetos para seu novo modelo customizado e defina seu modelo.
Não se esqueça de adicionar esta linha de código no seu
settings.py
:É isso que eu faço e sempre funciona.
fonte
Atualmente, no Django 2.2, a maneira recomendada ao iniciar um novo projeto é criar um modelo de usuário personalizado que herda de AbstractUser e, em seguida, aponte AUTH_USER_MODEL para o modelo.
Fonte: https://docs.djangoproject.com/en/2.2/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project
fonte
Uma abordagem simples e eficaz é models.py
fonte