Форма Django, создающая новую запись вместо обновления

#django #django-models #django-forms #django-views #django-templates

#django #django-модели #django-forms #django-представления #django-шаблоны

Вопрос:

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

Сообщение ОБ ОШИБКЕ: django.db.utils.Ошибка целостности: сбой УНИКАЛЬНОГО ограничения: auth_user.username

forms.py:

 class UserChangeForm(forms.ModelForm):

    class Meta:
        model = User
        fields = ['email', 'first_name', 'last_name']

    def __init__(self, username, *args, **kwargs):
        super(UserChangeForm, self).__init__(*args, **kwargs)
        self.username = username

  

views.py:

 def profile(request):

    user = request.user

    if request.method == 'POST':
        user_form = UserChangeForm(user, request.POST)

        if user_form.is_valid():
            user_form.save()
            messages.success(request, f'Your account has been updated!')

            return redirect('users:profile')

    else:
        email = request.user.email
        first_name = request.user.first_name
        last_name = request.user.last_name
        user_form = UserChangeForm(user, initial={
            'email': email,
            'first_name': first_name,
            'last_name': last_name
        })

    context = {
        'user_form': user_form,
    }

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

Ответ №1:

вам нужно передать пользователя как экземпляр в условии if и в else тоже так

 def profile(request):
    if request.method == 'POST':
        user_form = UserChangeForm(request.POST , instance = request.user)

        if user_form.is_valid():
            user_form.save()
            messages.success(request, f'Your account has been updated!')

            return redirect('users:profile')

    else:
        user_form = UserChangeForm(instance=request.user)

    context = {
        'user_form': user_form,
    }
    return render(request, 'users/profile.html', context)