Не удается получить экземпляр профиля, в поле которого зарегистрирован пользователь
У меня есть представление '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()