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)