2012-01-05 14 views
5

Estoy usando SelectDateWidget con django-registration para guardar una fecha de nacimiento en el registro. Intenté excluir el cumpleaños y se creó un perfil y se guardó con los datos adicionales. No estoy muy seguro de dónde está yendo todo mal.Django SelectDateWidget no guarda la fecha

models.py

class Profile(models.Model): 
    ... 
    dob = models.DateField(_('birthday')) 

forms.py

from django.forms.extras.widgets import SelectDateWidget 

class ProfileRegistration(RegistrationFormTermsOfService): 
    ... 
    dob = forms.DateField(widget=SelectDateWidget(years=range(1999,1939,-1)), 
          label=_("Birthday"), 
         ) 

prifilebackend.py

from registration.forms import RegistrationForm 
from registration.models import RegistrationProfile 

    ... 
    class Backend(default.DefaultBackend): 
     ... 
     p = Profile.objects.get(user=new_user) 
     p.dob=kwargs['dob'] 
     p.save() 

El error que estoy recibiendo al registrarse el usuario es: profile_profile.dob no puede ser NULL

Los datos de publicación generan dob_day, dob_month y dob_year. He tratado de limpiar los datos, pero fue en vano. Cualquier ayuda sería muy apreciada.

Resuelto:

profilebackend.py

signals.user_registered.send(sender=self.__class__, 
            user=new_user, 
            request=request) 

     u = User.objects.get(username=new_user.username) 
     u.first_name = kwargs['first_name'] 
     u.last_name = kwargs['last_name'] 

     gender = kwargs['gender'] 
     dob = kwargs['dob'] 

     p = Profile(user = new_user, gender = gender, dob = dob) 
     p.save() 
     u.save() 

Respuesta

5

El cleaned data desde la instancia bound form debe incluir el objeto fecha correcta, si la forma no tiene errores.

uso de esta fecha objeto para asignarlo a p.dob

No acabo entiendo cómo se procesa el formulario de inscripción, pero en general funciona así: Después de que el formulario es enviado por el usuario, se crea una forma encuadernada, asegúrese de que sea válida y luego acceda a los datos del formulario limpiado. Algo como esto:

# forms.py 
... 
class RegistrationForm(forms.Form): 
    ... 
    dob = forms.DateField(widget=widgets.SelectDateWidget()) 

# views.py 
... 
def myform_view(request): 
    ... 
    if request.POST: 
     form = RegistrationForm(request.POST) 
     if form.is_valid(): 
      dob = form.cleaned_data.get('dob') 
      # dob is now a python date object 
      do_something_with_birthday(dob) 

Si el objeto dob fecha sigue siendo None o vacío cuando se trata de guardarlo con el backend, sugeriría empezar a depurar el código. Puede instalar django_extensions y ejecutar un servidor de desarrollo con ./manage.py runserver_plus para obtener un buen trazo de la pila interactiva de esta excepción. Alternativamente, también puede depurar su code with pdb.

+0

Estoy usando un backend personalizado y he podido guardar un first_name y last_name. lo siguiente: 'def clean_dob (auto): \t \t DOB = self.cleaned_data.get ('DOB') \t \t de impresión dob' en mi forms.py es imprimir la fecha en el formato correcto antes de que ocurra el error. Aún así solución. –

+0

Consulte las notas de depuración al final de mi respuesta. – Haes

+0

Muchas gracias por su consejo, ahorrar en el back-end hizo el truco. Vea arriba para mi solución. Estaba tratando de evitar la personalización de la vista. No vi ninguna razón para hacerlo. –

Cuestiones relacionadas