【问题标题】:Django Edit Profile View not saving new email valueDjango Edit Profile View 不保存新的电子邮件值
【发布时间】:2022-01-08 21:35:57
【问题描述】:

我正在(尝试)实现用户在其个人资料页面上编辑和更新其电子邮件地址的功能。端到端执行此操作时我没有收到任何错误,但新电子邮件未保存到数据库中。

一切似乎都在工作,甚至在 edit_profile 函数中重定向到个人资料页面,但 save() 似乎没有工作,用户电子邮件没有更新,当我被重定向回个人资料时页面,电子邮件仍然是当前值。

谢谢!

型号:

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

查看

@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>

【问题讨论】:

    标签: django django-models django-views django-forms


    【解决方案1】:

    您从不设置对象的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 将重新渲染带有错误的表单。

    【讨论】:

    • 如果您有时间,请提出几个快速问题。为什么使用 user = request.user 而不是 user = CustomUser.objects.get(id=request.user.id)。我同意你关于错误处理的观点,一旦我得到这个工作,我现在就会这样做。
    • @StevieMadds: 因为这是一个用户模型对象,所以通过执行CustomUser.objects.get(id=request.user.id),您将进行 second 查询以获取您已经拥有的内容:CustomUser 对象那是登录的用户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多