Не удается получить экземпляр профиля, в поле которого зарегистрирован пользователь

У меня есть представление 'create_project', где я пытаюсь назначить полю 'owner' созданного экземпляра проекта 'profile of the current user logged'. так вот он выдает ошибку, которая гласит:

DoesNotExist в /projects/create-project/

Профиль, соответствующий запросу, не существует.

create_project view :

def create_project(request): # create operation
form = projectForm() 
if (request.method == "POST"):
    form = projectForm(request.POST,request.FILES) 
    if form.is_valid(): # check if it valid
        project = form.save(commit=False) 
        project.owner = Profile.objects.get(user=request.user)
        project.save()
        return redirect("home")


context = {'form':form}
return render(request, 'projects/project_form.html',context)

Класс модели проекта:

class project(models.Model):
    owner = models.ForeignKey(Profile, null=True, blank=True, on_delete=models.SET_NULL)

Класс модели профиля:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True) 

Исходя из вашей реализации, вы должны вместо этого сделать;

project.owner, created = Profile.objects.get_or_create(user=request.user)

get_or_create() вернет объект и значение bool для того, был ли объект создан вызовом функции.

Я бы также посоветовал сделать владельца проекта внешним ключом User, а не Profile. Я унаследовал проект, который был настроен подобным образом, где объект был связан с профилем пользователя. В большинстве случаев нас интересовали детали из объекта User, поэтому ссылка на User была бы более логичной.

Вам также следует рассмотреть возможность использования сигнала для создания объектов профиля для пользователя. Я делаю это, используя post_save из User;

from django.contrib.auth import get_user_model
from django.db.models.signals import post_save
from django.dispatch import receiver

from .models import Profile

User = get_user_model()


@receiver(post_save, sender=User)
def build_profile_on_user_creation(sender, instance, created, **kwargs):
    if created:
        profile = Profile(user=instance)
        profile.save()
Вернуться на верх