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,
})