EditUserForm() создает нового пользователя вместо редактирования нужного в Django

Я новичок в Django и создаю свой первый сайт. Сейчас я нахожусь на этапе создания страниц регистрации/редактирования профиля.

Я правильно создал страницу регистрации, но у меня возникли трудности с созданием страницы редактирования профиля. Мой профиль имеет классические поля имя пользователя, имя, фамилия, email, пароль. На странице редактирования я хотел бы иметь возможность изменять только поле email.

По какой-то причине, вместо редактирования текущего пользователя, на странице редактирования профиля создается новый пользователь с пустыми полями, кроме того, которое я отредактировал.

Мой код можно найти ниже.

urls.py

urlpatterns = [
    path('register', views.register_user, name="register"),
    path('account', views.account_user, name="account"),
]

views.py

@unauthenticated_user
def register_user(request):
    if request.method == "POST":
        form = RegisterUserForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data['username']
            password = form.cleaned_data['password1']
            user = authenticate(username=username, password=password)
            login(request, user)
            messages.success(request, "Registration Succesfully")
            # ogni utente è associato ad un gruppo univoco
            Group.objects.get_or_create(name=username)
            group = Group.objects.get(name=username)
            group.user_set.add(user)
            user.save()
        else:
            pass
    else:
        form = RegisterUserForm()
    return render(request, 'authenticate/register_user.html', {
        'form': form,
    })

@authenticated_user
def account_user(request):
    if request.method == "POST":
        form = EditUserForm(request.POST)
        if form.is_valid():
            form.save()
        else:
            pass
    else:
        form = EditUserForm()
    return render(request, 'authenticate/account.html', {
        'form_edit': form,
    })

forms.py

class RegisterUserForm(UserCreationForm):
    email = forms.EmailField(widget=forms.EmailInput(attrs={
        'class':'form-control'
    }))
    first_name = forms.CharField(max_length=25, widget=forms.TextInput(attrs={
        'class':'form-control'
    }))
    last_name = forms.CharField(max_length=30, widget=forms.TextInput(attrs={
        'class':'form-control'
    }))

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2')

    def __init__(self, *args, **kwargs):
        super(RegisterUserForm, self).__init__(*args, **kwargs)

        self.fields['username'].widget.attrs['class'] = 'form-control'
        self.fields['password1'].widget.attrs['class'] = 'form-control'
        self.fields['password2'].widget.attrs['class'] = 'form-control'


class EditUserForm(UserChangeForm):
    password = None
    username = None

    email = forms.EmailField(widget=forms.EmailInput(attrs={
        'class': 'form-control'
    }))

    class Meta:
        model = User

        # select the fields that you want to display
        fields = ('email',)

register.html

<div class="shadow p-3 mb-5 bg-body rounded">
    {% if form.errors %}
        <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
          <symbol id="exclamation-triangle-fill" fill="currentColor" viewBox="0 0 16 16">
            <path d="M8.982 1.566a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566zM8 5c.535 0 .954.462.9.995l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995A.905.905 0 0 1 8 5zm.002 6a1 1 0 1 1 0 2 1 1 0 0 1 0-2z"/>
          </symbol>
        </svg>
        <div class="alert alert-danger d-flex align-items-center" role="alert">
          <svg class="bi flex-shrink-0 me-2" width="24" height="24" role="img" aria-label="Danger:"><use xlink:href="#exclamation-triangle-fill"/></svg>
          <div>
            There was an error with your form...
          </div>
        </div>
    {% endif %}

<form action="{% url 'register' %}" method=POST>
{% csrf_token %}
{{ form }}
    <br><br>
<input type="submit" class="btn btn-secondary">
</form>
</div>

edit.html

<div class="shadow p-3 mb-5 bg-body rounded">
    {% if form.errors %}
        <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
          <symbol id="exclamation-triangle-fill" fill="currentColor" viewBox="0 0 16 16">
            <path d="M8.982 1.566a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566zM8 5c.535 0 .954.462.9.995l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995A.905.905 0 0 1 8 5zm.002 6a1 1 0 1 1 0 2 1 1 0 0 1 0-2z"/>
          </symbol>
        </svg>
        <div class="alert alert-danger d-flex align-items-center" role="alert">
          <svg class="bi flex-shrink-0 me-2" width="24" height="24" role="img" aria-label="Danger:"><use xlink:href="#exclamation-triangle-fill"/></svg>
          <div>
            There was an error with your form...
          </div>
        </div>
    {% endif %}

<form action="{% url 'account' %}" method=POST>
{% csrf_token %}
{{ form_edit }}
    <br><br>
<input type="submit" class="btn btn-secondary">
</form>
</div>

Вы должны передать экземпляр вашего объекта, чтобы отредактировать его следующим образом

@authenticated_user
def account_user(request):
    if request.method == "POST":
        form = EditUserForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
        else:
            pass
    else:
        form = EditUserForm(instance=request.user)
    return render(request, 'authenticate/account.html', {
        'form_edit': form,
    })
Вернуться на верх