NOT NULL constraint failed: users_profile.user_id?

Когда я обновляю профиль пользователя, я продолжаю получать ошибку NOT NULL constraint failed: users_profile.user_id. Я пытался исправить это, установив аргумент commit в False form.save(commit =False) затем выполнив form.save(). Мой вопрос заключается в том, как я могу обновить свой профиль, при этом поле user в модели Profile автоматически заполняется текущим аутентифицированным пользователем
. Вот мой код...

users/views.py

@login_required(login_url=reverse_lazy("users:login"))
def profile(request,slug):

if request.method == "POST":
    form = ProfileUpdateForm(request.POST)
    if form.is_valid():
        form.save(commit = False)
        form.cleaned_data["user"] = request.user
        form.save()
        messages.success(request, "Profile updated successfully!")
        return redirect("users:profile", kwargs="profile")
    
else:
    profile = Profile.objects.get(user__username = slug)
    form = ProfileUpdateForm()

context = {"profile":profile,"form":form}

return render(request, "users/profile.html", context)

users/models.py

class Profile(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    bio = models.TextField(blank = True)
    image = models.ImageField(default = "default.jpg", upload_to = "profile_pics")
    city = models.CharField(max_length=20,blank = True)
    url = models.URLField(blank = True)

    def __str__(self):
        return f"{self.user.username}'s profile"

users/signals.py

@receiver(post_save, sender = User)
def create_profile(sender,instance,created,**kwargs):
    if created:
        Profile.objects.create(user=instance)


@receiver(post_save, sender = User)
def create_profile(sender,instance,created,**kwargs):
    instance.profile.save()

users/forms.py

class ProfileUpdateForm(forms.ModelForm):
    class Meta:
        model = Profile
        exclude = ["user"]

У вас плохой дизайн в представлении профиля. Если он предназначен только для редактирования профиля request.user, то он должен выглядеть следующим образом:

@login_required(login_url=reverse_lazy("users:login"))
def profile(request):
profile = Profile.objects.get(user=request.user)
if request.method == "POST":
    form = ProfileUpdateForm(request.POST, instance=profile)
    if form.is_valid():
        form.save(commit = False)
        form.save()
        messages.success(request, "Profile updated successfully!")
        return redirect("users:profile", kwargs="profile")
    
else:
    
    form = ProfileUpdateForm(instance=profile)

context = {"profile":profile,"form":form}

return render(request, "users/profile.html", context)
Вернуться на верх