Данные не сохраняются в модели профиля
При попытке зарегистрировать нового пользователя через форму регистрации поля номер телефона (phone_number) и идентификатор библиотеки (library_id) не сохраняются в базе данных. Несмотря на то, что эти поля включены в форму регистрации и корректно отображаются, отправленные значения не записываются в базу данных.
views.py
def user_register(request):
userIsAuthenticated = False
if request.user.is_authenticated:
username1 = request.user.username
userIsAuthenticated = True
else:
username1 = "N/A"
userIsAuthenticated = False
if request.method == 'GET':
form = RegisterForm()
return render(request, "register.html", {"form":form, "username": username1, "userIsAuthenticated": userIsAuthenticated})
if request.method == 'POST':
form = RegisterForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.save()
login(request, user)
return render(request, "register-success.html")
else:
return render(request, 'register.html', {"form":form, "username": username1, "userIsAuthenticated": userIsAuthenticated})
forms.py
class RegisterForm(UserCreationForm):
first_name = forms.CharField(max_length=100)
last_name = forms.CharField(max_length=100)
library_id = forms.CharField(max_length=100)
phone_number = forms.CharField(max_length=100)
class Meta:
model = User
fields = ['first_name', 'last_name', 'username', 'email', 'password1', 'password2']
def save(self, commit=True):
user = super().save(commit=False)
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.email = self.cleaned_data['email']
if commit:
Profile.objects.create(
user=user,
phone_number=self.cleaned_data['phone_number'],
library_id=self.cleaned_data['library_id']
)
user.save()
return user
models.py
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
phone_number = models.CharField(max_length=100)
library_id = models.CharField(max_length=100)
def __str__(self):
return self.user.username
signals.py
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
Более подробная информация (процесс регистрации, проблема в деталях):
- заполните регистрационную форму Заполните форму регистрации на сайте
- давайте посмотрим на таблицу db
id | username | first_name | last_name | |
---|---|---|---|---|
27 | dolor | Lorem | ipsum | sit@amet.consectetur |
Остальные детали сохраняются в модели Profile. Давайте посмотрим на нее!
id | user_id | phone_number | library_id |
---|---|---|---|
12 | 27 | "" | "" |
Здесь данные из заполненной формы не сохраняются.
Кроме того, я могу заполнить эти поля (phone_number, library_id) с помощью панели администратора, так что проблема, скорее всего, в функции user_register.
Потому что логика сохранения информации в модели Profile
зависит от commit=True
в методе .save()
вашей формы.
Но вы никогда не вызываете RegisterForm.save(commit=True)
, вы вызываете его только с помощью commit=False
. Это означает, что Profile
-логика никогда не выполняется. Причина, по которой вы вообще получаете объект Profile
в базе данных, заключается в create_user_profile
-сигнале.
def save(self, commit=True):
user = super().save(commit=False)
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.email = self.cleaned_data['email']
if commit: # <---- NB! Conditional execution only when commit=True
Profile.objects.create(
user=user,
phone_number=self.cleaned_data['phone_number'],
library_id=self.cleaned_data['library_id']
)
user.save()
return user
def user_register(request):
[...]
if request.method == 'POST':
form = RegisterForm(request.POST)
if form.is_valid():
user = form.save(commit=False) # <-- NB! commit=False
Есть много способов сделать это, но вам придется решить, как управлять логикой сохранения между вашей формой и вашей моделью(ями).