Question

J'ai trouvé ici sur stackoverflow une méthode pour étendre django est intégré dans l'authentification au moyen de signaux. Ma base est définie par l'utilisateur « email » et mots de passe (donc pas le nom d'utilisateur là-bas). Donc, je suis en train de le modifier à mes besoins, mais je suis geting une erreur de validation pour ma forme. Chose étrange est que l'erreur est connecté au champ User.email et je deviens « déjà utilisé », même si je suis juste enregistrer le moment. Est-il tente de sauver 2 fois ou quoi? Je l'ai découvert quand j'envoyais le dictionnaire des données à la contstructor de forme en coquille: form = MyForm(data={}). Après cette forme était encore valide, mais en changeant un courriel à valeur différente m'a finalement donné vrai.

La fonction user_created connecté au signal d'enregistrement:

def user_created(sender, user, request, **kwargs):
    form = CustomRegistrationForm(request.POST, request.FILES)
    if form.is_valid():
        data = UserProfile(user=user)
        data.is_active = False
        data.first_name = form.cleaned_data['first_name']
        data.last_name = form.cleaned_data['last_name']
        data.street = form.cleaned_data['street']
        data.city = form.cleaned_data['city']
        data.save()
    else:
        return render_to_response('user/data_operations/error.html', {'errors': form._errors}, context_instance=RequestContext(request))

user_registered.connect(user_created)

Ma forme:

class CustomRegistrationForm(RegistrationForm):
    first_name = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)
    last_name = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)
    street = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)
    city = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)

Mon modèle:

class UserProfile(models.Model):
    first_name = models.CharField(_("Name"), max_length=50, blank=False,)
    last_name = models.CharField(_("Last name"), max_length=50, blank=False,)
    street = models.CharField(_("Street"), max_length=50, blank=False,)
    city = models.CharField(_("City"), max_length=50, blank=False,) 
    user = models.ForeignKey(User, unique=True, related_name='profile',)

Formulaire d'inscription: classe RegistrationForm (forms.Form):

email = forms.EmailField(widget=forms.TextInput(attrs=dict(attrs_dict,
                                                           maxlength=75)),
                         label=_("Adres email"))
password1 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False),
                            label=_("Haslo"))
password2 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False),
                            label=_("Haslo powtorzone"))

def clean_email(self):
    email = self.cleaned_data.get("email")
    if email and User.objects.filter(email=email).count() > 0:
        raise forms.ValidationError(
            _(u"Already in use."))
    return email
Était-ce utile?

La solution

le signal « user_registered » est envoyé une fois l'utilisateur enregistré. Ainsi, il a déjà un champ « email » défini.

UPDATE


Utilisation de la pensée sans repos:

form = CustomRegistrationForm(request.POST, request.FILES, notvalidateemail=True)

et sous la forme:

def __init__(self, *args, **kwargs):
    self.notvalidateemail = kwargs.pop('notvalidateemail',False)
    super(CustomRegistrationForm, self).__init__(*args, **kwargs)

def clean_email(self):
    if self.notvalidateemail:
        return
    else:
        #your cleaning here
        return email

Autres conseils

Problème:

Votre formulaire est d'abord sauvé par django-inscription. Ensuite, vous l'enregistrer à nouveau dans user_created.

Solutions:

  1. Utiliser une forme différente dans user_created. Celui qui ne se sont déjà enregistrés les champs (ceux-ci à partir du modèle utilisateur comme le courrier électronique). Vous voulez juste enregistrer des données supplémentaires dans user_created, droit?

  2. Ajouter des paramètres à la forme comme:

user_created:

form = CustomRegistrationForm(dontvalidateemail=True, request.POST, request.FILES)

et en forme de init

self.dontvalidateemail = dontvalidateemail

puis juste vérifier dans clean_email.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top