IntegrityError at /accounts/signup/ NOT NULL constraint failed: users_user.birth_date in Django allauth form

Я получаю следующую ошибку, когда пытаюсь зарегистрироваться, используя форму Django allauth с пользовательской моделью пользователя.

IntegrityError at /accounts/signup/
NOT NULL constraint failed: users_user.birth_date

Вот пользовательская модель пользователя и ее менеджер, которые я использую:

Вот форма, которую я использую:

class CustomSignupForm(SignupForm):
    first_name = forms.CharField(label='First name', widget=forms.TextInput, required=True, max_length=128)
    last_name = forms.CharField(label='Last name', widget=forms.TextInput, required=True, max_length=128)
    profession_title = forms.CharField(label='Profession name', widget=forms.TextInput, required=True, max_length=128)

    country = forms.CharField(label='Country', widget=forms.TextInput, required=True, max_length=32)
    city = forms.CharField(label='City', widget=forms.TextInput, required=True, max_length=64)
    postal_code =  forms.CharField(label='Postal code', widget=forms.TextInput, required=True, max_length=24)
    address =  forms.CharField(label='Address', widget=forms.TextInput, required=True, max_length=255)
    
    workplace =  forms.CharField(label='Workplace', widget=forms.TextInput, required=True, max_length=128)
    phone_nr =  forms.CharField(label='Phone number', widget=forms.TextInput, required=True, max_length=32)
    birth_date = forms.DateField(label='Birth date', widget=forms.SelectDateWidget(years=range(1900, datetime.now().year)), required=True)


    is_staff = forms.BooleanField(label='Is admin?', widget=forms.CheckboxInput, required=False)


    def __init__(self, *args, **kwargs):
        super(CustomSignupForm, self).__init__(*args, **kwargs)
        del self.fields['password2']
        del self.fields['password1']

    def signup(self, request, user):
        self.cleaned_data['password1'] = 'unknown'

        print("Birth date", self.cleaned_data['birth_date'])

        user = super(CustomSignupForm, self).save(commit=False)

        password = User.objects.make_random_password()
        user.set_password(password)
        user.save()
        return user

    class Meta:
        model = User
        fields = ('email', 'first_name', 'last_name', 
                'profession_title','country', 'city', 'postal_code','address',
                'is_staff','workplace', 'phone_nr', 'birth_date',)

Сообщение об ошибке, которое я получаю, выглядит следующим образом:

дата рождения должна быть обязательным полем в базе данных.

Я пытался присвоить дату рождения непосредственно перед user.save, как например this:

def signup(self, request, user):
    self.cleaned_data['password1'] = 'unknown'

    print("Birth date", self.cleaned_data['birth_date'])

    user = super(CustomSignupForm, self).save(commit=False)

    password = User.objects.make_random_password()
    user.set_password(password)
    user.birth_date = self.cleaned_data['birth_date']
    user.save()
    return user

Но я все еще получаю ту же ошибку.

Это исправляется только тогда, когда я удаляю "birth_date" из таблицы и мигрирую. Но это не то решение, которое мне нужно, так как я хочу иметь поле birth_date, которое является обязательным.

Я пытался отлаживать, но не могу увидеть, что находится внутри набора clean_data. Я не могу понять, почему я получаю эту ошибку.

Как исправить эту ошибку?

Похоже, что эта ошибка возникает из-за того, как вы установили атрибут birth_date в вашем классе User. Вы установили null=False и blank=True, поэтому я бы предположил, что ограничение NOT NULL не сработало, потому что вы пытались установить поле в None, в то время как это не было разрешено из-за blank=True. Я бы предложил удалить одно или другое в вашем определении birth_date, но было бы неплохо увидеть, что находится внутри cleaned data, чтобы знать, что именно передается Django.

Я не понял, почему. Сначала я предположил, что он сохраняет все остальные данные, но это не так. Он не сохраняет никаких данных. Я следовал некоторому руководству allauth в Интернете и использовал def signup(), я должен был просто использовать def save(). Я нашел решение в Интернете:

Django allauth: Пользовательская форма SignUp не сохраняет все поля

Вернуться на верх