Como mudar padrão modelo django usuário para caber minhas necessidades?

votos
12

O padrão de Django Usermodelo tem alguns campos, e regras de validação, que eu realmente não precisa. Eu quero fazer o registro o mais simples possível, isto é, requerem-mail ou nome de usuário ou número de telefone - todas aquelas ser único, portanto, bom como identificadores de usuários.

Eu também não gosto de conjunto de caracteres padrão para o nome do usuário que é validado no modelo de usuário Django. Eu gostaria de permitir que qualquer personagem lá - por que não?

Eu costumava aplicação Django do perfil do usuário antes de adicionar um perfil de usuário - mas desta vez eu prefiro fazer a classe mimimal. Mas eu ainda quero usar a Userclasse, como ele me dá uma maneira fácil de ter partes do site restrito apenas para usuários logados.

Como eu faço isso?

Publicado 22/05/2009 em 06:01
fonte usuário
Em outras línguas...                            


5 respostas

votos
9

Em vez de modificar a classe de usuário diretamente ou fazer subclassificação, você também pode simplesmente redirecionar os campos existentes.

Para um site que eu utilizado o campo "first_name" como o "nome exibido publicamente" de um usuário e encher uma versão slugified de que no campo "username" (para uso em URLs). Eu escrevi um backend de autenticação personalizada para permitir que as pessoas login usando o seu "nome público" ou seu endereço de email, e eu impor a singularidade de ambos os aqueles em tempo de registro. Isso funciona muito bem com outros aplicativos reutilizáveis ​​e não introduz mesas extras ou consultas.

Por outro site que eu não queria usernames de todo, apenas e-mails únicas. A fim de satisfazer a necessidade de Django para um nome de usuário único, eu só hash o endereço de email e usados ​​que, como o nome de usuário (que você tem a base64 codificar o hash para apertá-lo com menos de 30 caracteres). Personalizado backend auth para permitir login com email.

Se compatibilidade com versões anteriores não eram um problema, há uma série de melhorias que eu gostaria de ver feito para django.contrib.auth eo modelo de usuário para torná-los mais flexíveis. Mas há muita coisa que você pode fazer dentro das limitações atuais com um pouco de criatividade.

Respondeu 22/05/2009 em 15:59
fonte usuário

votos
7

Eu descaracterizou a pergunta. Espero que este post é útil para ninguém.

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

Isto irá criar uma userprofile cada vez que um usuário é salvo se for criada. então você pode usar

  user.get_profile().whatever

Aqui está mais algumas informações dos docs

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

Respondeu 22/05/2009 em 14:47
fonte usuário

votos
7

O modelo de usuário Django está estruturado muito sensata. Você realmente não quer permitir caracteres arbitrários em um nome de usuário, por exemplo, e existem maneiras de conseguir -mail de login endereço , sem mexer alterações ao modelo de base.

Para armazenar simplesmente informações adicionais em torno de uma conta de usuário, Django suporta a noção de perfis de usuário. Enquanto você não precisa contar com o suporte embutido para lidar com isso, é uma convenção que é comumente seguido e vai permitir que você jogar bonito com os aplicativos Django reutilizáveis que estão flutuando no éter. Para mais informações, veja aqui .

Se você quiser realmente modificar o modelo de usuário do núcleo, mas também "jogar bonito" com aplicativos reutilizáveis ​​que dependem dele, você está abrindo um pouco de uma caixa de Pandora. Desenvolvedores fazer suposições básicas sobre como a biblioteca central está estruturado, por isso, qualquer mudança pode causar a ruptura inesperada. No entanto, você pode monkeypatch alterações ao modelo de base, ou ramificar uma cópia do Django localmente. Eu iria desencorajar o último, e só recomendo o antigo se você sabe o que está fazendo.

Respondeu 22/05/2009 em 08:59
fonte usuário

votos
0

Há anumber de maneiras de fazer isso, mas aqui está o que eu faria: eu permitir que um usuário insira um e-mail, nome de usuário (que deve conter pelo menos uma letra e não @símbolos) ou número de celular. Então, quando eu validá-lo:

  1. Verificar a presença de @. Se assim for, defina-o como e-mail do usuário, hash-lo de forma adequada e defini-lo como seu nome de usuário também.
  2. Verifique para ver se é apenas números, traços e +. Então, tira os caracteres apropriados e armazená-lo tanto como número de telemóvel e nome de usuário (se você está armazenando o número do celular em outro modelo para fins de SMS ou algo assim).
  3. Se não é qualquer um, basta configurá-lo como nome de usuário.

Eu também validar o telefone do campo email do usuário / / semelhante no login e olhar no lugar apropriado, de modo que, se, por exemplo, sinais de um usuário com o seu número de telemóvel e, em seguida, muda seu nome de usuário (para algum outro propósito), eles ainda podem entre com o seu número de telemóvel.

Respondeu 11/10/2010 em 01:58
fonte usuário

votos
0

Você enfrenta um pouco de um dilema que realmente tem duas soluções se você está empenhada em evitar a personalização baseada em perfil já apontou.

  1. Mudar o Usermodelo em si, por sugestões de Daniel
  2. Escrever uma CustomUserclasse, subclasse Userou copiar sua funcionalidade.

A última sugestão significa que você teria que implementar algumas coisas que Userautomaticamente faz manualmente, mas eu me pergunto se isso é tão ruim quanto parece, especialmente se você está no início de seu projeto. Tudo o que você tem a fazer é reescrever uma classe média-ware e alguns decoradores.

Claro, eu não acho que isso compra-lhe qualquer coisa que 1 você não vai ficar, a não ser que seu projeto não deve quebrar se svn updateo seu Django. Pode evitar alguns dos problemas de compatibilidade com outros aplicativos, mas meu palpite é a maioria dos problemas existirá qualquer maneira.

Respondeu 22/05/2009 em 15:09
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more