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 не сохраняет все поля