83 votes

Accepter une adresse email en tant que nom d'utilisateur dans Django

Y a-t-il un bon moyen de faire cela dans Django sans lancer mon propre système d'authentification? Je veux que le nom d'utilisateur soit l'adresse électronique de l'utilisateur au lieu de créer un nom d'utilisateur.

S'il vous plaît conseiller, merci.

35voto

Tom Christie Points 8729

Pour quelqu'un d'autre qui veulent ce faire, je vous recommande de prendre un coup d'oeil à django-e-mail comme nom d'utilisateur qui est une jolie solution complète, qui comprend colmatage de l'admin et l' createsuperuser gestion des commandes, entre autres, de pièces et de morceaux.

Edit: Comme de Django 1.5, vous devriez envisager d'utiliser un utilisateur personnalisée modèle au lieu de django-e-mail comme nom d'utilisateur.

28voto

S.Lott Points 207588

Voici ce que nous faisons. Ce n'est pas une solution "complète", mais elle fait beaucoup de ce que vous recherchez.

 from django import forms
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        exclude = ('email',)
    username = forms.EmailField(max_length=64,
                                help_text="The person's email address.")
    def clean_email(self):
        email = self.cleaned_data['username']
        return email

class UserAdmin(UserAdmin):
    form = UserForm
    list_display = ('email', 'first_name', 'last_name', 'is_staff')
    list_filter = ('is_staff',)
    search_fields = ('email',)

admin.site.unregister(User)
admin.site.register(User, UserAdmin)
 

22voto

Juho Rutila Points 310

Voici une façon de le faire pour que le nom d'utilisateur et l'adresse électronique soient acceptés:

 from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth.models import User

class EmailAuthenticationForm(AuthenticationForm):
    def clean_username(self):
        username = self.data['username']
        if '@' in username:
            username = User.objects.get(email=username).username
        return username
 

Je ne sais pas s'il existe un paramètre pour définir le formulaire d'authentification par défaut, mais vous pouvez également remplacer l'URL dans urls.py

 url(r'^accounts/login/$', 'django.contrib.auth.views.login', { 'authentication_form': EmailAuthenticationForm }, name='login'),
 

1voto

PhoebeB Points 2862

La dernière version de django-registration permet une belle personnalisation et peut faire le travail - docs ici https://bitbucket.org/ubernostrum/django-registration/src/fad7080fe769/docs/backend-api.rst

0voto

Rama Vadakattu Points 616

vous pouvez également trouver une discussion intéressante sur ce sujet en cliquant sur le lien ci-dessous:

http://groups.google.com/group/django-users/browse_thread/thread/c943ede66e6807c/2fbf2afeade397eb#2fbf2afeade397eb

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X