Django Edit Profile View не сохраняет новое значение электронной почты

Я пытаюсь реализовать возможность для пользователя редактировать и обновлять свой адрес электронной почты на странице профиля. Я не получаю никаких ошибок при выполнении этой операции, но новый email не сохраняется в БД.

Все вроде бы работает, даже перенаправление на страницу профиля в функции edit_profile, но save() не работает, email пользователя не обновляется, а когда я перенаправляюсь обратно на страницу профиля, email остается текущим значением.

Спасибо!

Модель:

class CustomUser(AbstractUser):
email = models.EmailField(_('email address'), unique=True)
is_pro = models.BooleanField(default=False)
is_golfer = models.BooleanField(default=False)

def __str__(self):
    return self.email

Форма

class EditProfileForm(forms.Form):
email = forms.EmailField(
    label='', widget=forms.TextInput(attrs={'class': 'form-field'}))

View

@login_required
def edit_profile(request):
if request.method == "POST":
    form = EditProfileForm(request.POST)
    if form.is_valid():
        email = form.cleaned_data["email"]
        
        user = CustomUser.objects.get(id=request.user.id)
        user.save()
    return redirect("typeA", username=user.username)
else:
    form = EditProfileForm()
return render(request, "registration/edit_profile.html", {'form': form})

УРЛЫ

urlpatterns = [
path('type_a_signup/', ASignUpView.as_view(), name='a_signup'),
path('type_b_signup/', BSignUpView.as_view(), name='b_signup'),
path('login/', LoginView.as_view(), name='login'),
path('password_reset', PasswordResetView.as_view(), name='password_reset'),
path('typea/<username>/', typeA, name='typeA'),
path('typeb/<username>/', typeB, name='typeB'),
path('login_success/', login_success, name='login_success'),
path('edit_profile/', edit_profile, name='edit_profile'),
]

Шаблон

<div class="container">
<div class="form-container">
    <h2>Edit profile</h2>
    <form method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <div>
            {{ form.email.label_tag }}
            <input type="text" class="form-control {% if form.email.errors %}is-invalid{% endif %}" id="id_email"
                name="email" value='{{ form.email.value|default:user.email }}'>
            {% if form.email.errors %}
            <div>{{ form.email.errors }}</div>
            {% endif %}
        </div>
        <button type="submit">Submit</button>
    </form>
    <br>
</div>

Вы никогда не устанавливаете поле email объекта. Вы должны задать его с помощью:

@login_required
def edit_profile(request):
if request.method == "POST":
    form = EditProfileForm(request.POST)
    if form.is_valid():
        email = form.cleaned_data["email"]
        user = request.user
        user.email = email  # 🖘 set the email field
        user.save()
        return redirect("typeA", username=user.username)
else:
    form = EditProfileForm()
return render(request, "registration/edit_profile.html", {'form': form})

Вы должны перенаправлять только в том случае, если форма успешна. Если это не так, Django отправит форму с ошибками.

Вернуться на верх