Pregunta

he encontrado aquí en stackoverflow un método para extender Django incorporado en la autenticación mediante señales. Mi usuario de base se define por 'e-mail' y contraseñas (por lo que no hay nombre de usuario). Así que estoy tratando de modificarlo para mis necesidades, pero estoy que consigue un error de validación de mi forma. Lo extraño es que el error está conectado con el campo User.email y yo estoy poniendo 'ya está en uso' a pesar de que sólo estoy de registrarse en el momento. ¿Está intentando salvarlo 2 veces o qué? He descubierto que cuando yo estaba enviando diccionario con los datos de contstructor de forma en la shell: form = MyForm(data={}). Después de esta forma seguía siendo válido, pero cambiando de correo electrónico a un valor diferente finalmente me dio verdadera.

La función user_created conectado a señal de registro:

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)

Mi forma:

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)

Mi modelo:

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',)

Formulario de inscripción: clase 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
¿Fue útil?

Solución

su señal 'user_registered' se envía después de que se guarda el usuario. Por lo que ya tiene un campo 'email' definido.

Actualizar


El uso de pensamiento inquieto:

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

y en forma:

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

Otros consejos

Problema:

Su formulario se guarda por primera vez por django-registro. A continuación, se guarda de nuevo en user_created.

Soluciones:

  1. Usar una forma diferente en user_created. Uno campos que no va a haber guardado (estos de usuario del modelo como el correo electrónico). Lo que desea guardar los datos adicional en user_created, ¿verdad?

  2. Añadir algunos parámetros de la forma como:

en user_created:

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

y en forma de init ;

self.dontvalidateemail = dontvalidateemail

A continuación, sólo echa en clean_email.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top