Django SelectDateWidget не сохраняет дату - PullRequest
5 голосов
/ 05 января 2012

Я использую SelectDateWidget с django-регистрацией, чтобы сохранить дату рождения при регистрации. Я попытался исключить день рождения, и профиль создан и сохранен с дополнительными данными. Я не совсем уверен, где все идет не так.

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

Ошибка, которую я получаю при регистрации пользователя: profile_profile.dob не может быть NULL

Почтовые данные генерируют dob_day, dob_month и dob_year. Я пытался очистить данные, но безрезультатно. Любая помощь будет принята с благодарностью.

Решено:

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

1 Ответ

5 голосов
/ 05 января 2012

очищенные данные из связанной формы должны содержать правильный объект даты, если в форме нет ошибок.

Используйте этот объект даты, чтобы присвоить его p.dob

Я не совсем понимаю, как вы обрабатываете свою регистрационную форму, но в целом она работает так: после того, как форма отправлена ​​пользователем, вы создаете связанную форму, убедитесь, что она действительна, а затем получите доступ к очищенной форме. данные. Примерно так:

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

Если объект даты dob по-прежнему None или пуст при попытке сохранить его с помощью бэкэнда, я бы посоветовал вам начать отладку кода. Вы можете установить django_extensions и запустить сервер разработки с ./manage.py runserver_plus, чтобы получить хорошую интерактивную трассировку стека для этого исключения. Кроме того, вы также можете отладить код с помощью pdb .

...