2010-11-06 27 views
2

J'ai ajouté un backend personnalisé pour permettre à un utilisateur de se connecter avec un nom d'utilisateur ou un e-mail en plus du mot de passe. Cela fonctionne bien sauf lorsque l'email est plus long que 30 caractères. L'erreur de forme que je reçois est:30 erreur de limite de char lors de la connexion au site django avec email et mot de passe

"Ensure this value has at most 30 characters (it has 35)." 

Dans un mon mon fichier urls.py d'applications que j'ai redéfinie la max_length du champ de nom d'utilisateur comme ceci:

from django.contrib.auth.forms import AuthenticationForm 
AuthenticationForm.base_fields['username'].max_length = 75 

J'ai même essayé le technique du signal class_prepared décrit ici:

http://stackoverflow.com/questions/2610088/can-djangos-auth-user-username-be-varchar75-how-could-that-be-done/2613385#2613385 

Je ne sais pas où je vais mal ici et je vous remercie de l'aide.

+0

Avez-vous fait en sorte que le champ de nom d'utilisateur dans la base de données peut contenir des chaînes plus longues de 30 chars? Le signal 'class_prepare' ne sera utile que si vous avez exécuté syncdb et créé la table. Syncdb ne modifie jamais les tables existantes. – OmerGertel

Répondre

4

Si votre objectif est de modifier simplement la longueur du champ de nom d'utilisateur le formulaire (et ne pas modifier la longueur du champ username dans la base de données), alors la solution correcte est de sous-classer AuthenticationForm comme suit:

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

class MyAuthenticationForm(AuthenticationForm): 
    username = forms.CharField(label="Username", max_length=75) 

En fait, la docstring pour AuthenticationForm indique même "Classe de base pour authentifier les utilisateurs. Étendre ce pour obtenir un formulaire qui accepte les connexions nom d'utilisateur/mot de passe. »

Utilisez votre nouvelle forme à la place de l'ancien AuthenticationForm dans vos modèles, vues, etc.

Quant à savoir pourquoi votre code ne fonctionne pas, je suppose que l'urls.py de votre application n'est pas en cours de chargement avant l'importation de l'AuthenticationForm ailleurs.Je ne peux pas jurer que c'est la raison, mais c'est le plus probable

+0

Cela fonctionne très bien! Et le formulaire sous-classé peut être passé à la vue de connexion, donc je suis tout ensemble. Merci. – asciitaxi

+0

Est-ce que vous utilisez l'enregistrement django? Si oui, où avez-vous mis le code ci-dessus? En ce moment, le formulaire de connexion est généré automatiquement, donc je ne suis pas sûr de savoir où le remplacer – Brenden

0

Je pense: sur l'utilisation urls.py:

from django.contrib.auth.views import login 

... 

    (r'^accounts/login/$', login), 

au lieu de la forme « d'évaluation paresseuse »:

(r'^accounts/login/$', 'django.contrib.auth.views.login'), 
0

Meilleur moyen est ce code ajouté à le niveau supérieur init:

# Added so the login field can take email addresses longer than 30 characters 
from django.contrib.auth.forms import AuthenticationForm 

AuthenticationForm.base_fields['username'].max_length = 75 
AuthenticationForm.base_fields['username'].widget.attrs['maxlength'] = 75 
AuthenticationForm.base_fields['username'].validators[0].limit_value = 75 

Toutefois, si vous choisissez de nous @Gabriel Hurley réponse ci-dessus, vous pouvez passer à la forme de connexion en utilisant le code suivant:

(r'^accounts/login/$', 'django.contrib.auth.views.login', { 
    'authentication_form': AuthenticationForm 
}),