2012-01-05 19 views
5

Sto usando SelectDateWidget con la registrazione django per salvare una data di nascita al momento della registrazione. Ho provato ad escludere il compleanno e il profilo è stato creato e salvato con i dati aggiuntivi. Non sono abbastanza sicuro di dove tutto stia andando storto.Django SelectDateWidget non salva data

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() 

L'errore che sto ottenendo al momento della registrazione l'utente è: profile_profile.dob non possono essere NULL

I dati del post generano dob_day, dob_month e dob_year. ho provato a pulire i dati, ma senza alcun risultato. Qualsiasi assistenza sarebbe molto apprezzata.

risolto:

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() 

risposta

5

Il cleaned data dall'istanza bound form dovrebbe includere l'oggetto data corretta, se il modulo non presenta errori.

Utilizzare questa data oggetto da assegnare a p.dob

non ho ben capito come si elabora il modulo di registrazione, ma in generale funziona in questo modo: dopo il modulo viene inviato dall'utente, si crea un modulo associato, assicurarsi che sia valido e quindi accedere ai dati del modulo puliti. Qualcosa di simile a questo:

# 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) 

Se l'oggetto dob data è ancora None o vuoto quando si cerca di salvarlo utilizzando il vostro backend, suggerirei di iniziare il debug del codice. È possibile installare django_extensions ed eseguire un server di sviluppo con ./manage.py runserver_plus per ottenere una traccia di stack interattiva di questa eccezione. In alternativa, puoi anche eseguire il debug del tuo code with pdb.

+0

Sto utilizzando un back-end personalizzato e sono stato in grado di salvare un first_name e last_name. il seguente: 'def clean_dob (self): \t \t dob = self.cleaned_data.get ('DOB') \t \t stampa dob' nel mio forms.py è stampare la data nel formato corretto prima che si verifichi l'errore. Ancora così soluzione. –

+0

Vedere le note di debug alla fine della mia risposta. – Haes

+0

Grazie mille per il tuo consiglio di risparmio nel back-end ha fatto il trucco. Vedi sopra per la mia soluzione. Stavo cercando di evitare la personalizzazione della vista. Non ho visto alcuna ragione per –

Problemi correlati