Как я могу сохранить форму 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})

Ваша проблема в том, что пользователь, с которым вы пытаетесь сохранить, не является аутентифицированным пользователем, который существует в базе данных. Только аутентифицированные (вошедшие в систему) пользователи существуют в базе данных и могут быть использованы в реляционном поле

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