Как я могу сохранить форму django
Я хочу сохранить биографию для каждого нового созданного пользователя. Пользователь может ввести свою биографию и она будет сохранена в его профиле.
Для этого я создал модель с OneToOneField
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
class Profile(models.Model):
user = models.OneToOneField(
User, on_delete=models.CASCADE, null=True, blank=True)
bio = models.CharField(max_length=30)
Для создания формы я сделал следующее в файле forms.py:
class BioForm(forms.ModelForm):
class Meta:
model = Profile
fields = ('bio',)
Затем я создал в views.py сохранение, так что биография будет сохранена для определенного пользователя:
from .forms import LoginForm, RegisterForm
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout, get_user_model
from django.contrib.auth import get_user_model
def test_view(request):
form = BioForm(request.POST)
user = get_user_model
if form.is_valid():
profile = form.save(commit=False)
profile.user = request.user
profile.phone_number = request.phone_number
profile.save()
return render(request, 'test.html', {'form': form})
В views.py что-то сильно не так, но я не понимаю. Я могу отправить форму и форма будет сохранена (иногда), но без пользователя, который ее написал + я получаю эту ошибку:
ValueError at /test/
Cannot assign "<SimpleLazyObject: <django.contrib.auth.models.AnonymousUser object at 0x00000253B7140D00>>": "Profile.user" must be a "User" instance
Попробуйте вместо этого присвоить идентификатор пользователя
from .forms import LoginForm, RegisterForm
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout, get_user_model
from django.contrib.auth import get_user_model
def test_view(request):
form = BioForm(request.POST)
user = get_user_model
if form.is_valid():
profile = form.save(commit=False)
profile.user_id = request.user.id
profile.phone_number = request.phone_number
profile.save()
return render(request, 'test.html', {'form': form})
Ваша проблема в том, что пользователь, с которым вы пытаетесь сохранить, не является аутентифицированным пользователем, который существует в базе данных. Только аутентифицированные (вошедшие в систему) пользователи существуют в базе данных и могут быть использованы в реляционном поле