2009-04-01 9 views
14

Możliwe zduplikowane:
Accepting email address as username in DjangoJak używać adresu e-mail zamiast nazwy użytkownika do uwierzytelniania użytkownika?

modelu uwierzytelniania dostarczane wraz z znajduje się domyślnie na podstawie użytkownika.

Co zrobić, aby zmienić uwierzytelnianie na podstawie wiadomości e-mail zamiast na nazwa użytkownika?

Aby być bardziej konkretny:

Z uwierzytelniania nazwę użytkownika, aby zalogować się użytkownikowi mamy następujące:

user = authenticate(name,password) 
....... 
login(request,user) 

co napisać do powyższych stwierdzeń, czy jesteśmy autentyczną za pomocą e-maila?

Na formularzu:

Mam zamiar napisać własny formularz, który zawiera pola e-mail, hasło i walidacji. Czy to właściwe podejście?

Odpowiedz

1

Wygląda na to, że można po prostu zamaskować nazwę użytkownika słowem "e-mail", a wszystkie nazwy użytkowników będą po prostu wyświetlały e-mail.

+0

Myślę, że nie możemy użyć pola nazwy użytkownika dla e-maila, ponieważ nie mogliśmy zapisać symbolu @ w nazwie użytkownika. –

+0

Hmm .... cóż, nie wiem dlaczego, ale jeśli tak jest, moja sugestia nie jest zbyt pomocna. – jerebear

+0

W Django 1.2 użytkownik @ może używać nazw użytkowników, więc to rozwiązanie może działać (i jest całkiem proste). – juanjux

5

Zapoznaj się z this snippet i przeczytaj komentarze do aktualizacji.

Dla formularza, dlaczego nie dziedziczyć po prostu (lub używać bezpośrednio) formularza logowania uwierzytelniającego. Zobacz django/contrib/auth/forms.py

+0

Zobacz także projekt django-emailauth: http://github.com/redvasily/django-emailauth/tree/master/, który, mam nadzieję, pewnego dnia również będzie obsługiwał logowanie w stylu EAUT. –

-1

Chyba coś mi umknęło, rozwiązanie powinno być bardzo proste; po prostu utwórz normalny formularz z polem tekstowym i polem hasła. Gdy metoda żądania HTTP to POST, spróbuj pobrać użytkownika z podanym adresem e-mail. Jeśli taki użytkownik nie istnieje, wystąpił błąd. Jeśli użytkownik istnieje, spróbuj uwierzytelnić użytkownika i zalogować się.

+0

To nie używa ORM Django – elit3x

7

Znalazłem this snippet podczas czytania duplikatu pytania do tego. Należy również sprawdzić this code:

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(admin.ModelAdmin): 
    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) 

Ani odpowiedź jest pierwotnie kopalni. Głosuj na drugi wątek do właścicieli, aby zwiększyć karmę. Właśnie skopiowałem je tutaj, aby ten wątek był jak najbardziej kompletny.

Powiązane problemy