django 恢复用户信息的更改

问题描述 投票:0回答:1

我想更改用户电子邮件(以及有关用户的其他信息)

所以我为它创建了一条路线,这是一个应该适用于更改电子邮件的最小示例:

@login_required
def change_email(request):
    email = request.POST['email']

    if email != request.user.email:
        request.user.email = email

    request.user.save()
    return JsonResponse({ 'message': 'Email updated' })

电子邮件已更改,但一两次请求后,电子邮件又恢复为旧电子邮件。

提供更多背景信息,我有两个 Django 应用程序:

pong
api
pong
负责SSR模板并将页面返回到前面:

# Custom render func I use to render templates in SPA
def render(request, template_name, context={}, status=200):
    if request.headers.get('X-Transcendence'):
        return django_render(request, template_name, context, status=status)

    template_html = loader.get_template(template_name).render(context, request)
    return django_render(request, 'base.html', { 'content': template_html }, status=status)
<!-- change_email.html -->
<span id="message"></span>
<span id="error"></span>
<form method="post" action="{% url 'api:change_email' %}" onsubmit="handleChangeEmail(event)">
  {% csrf_token %}
  <input type="email" name="email" placeholder="Email" value="{{ request.user.email }}" required>
  <button type="submit">Save</button>
</form>
// handler func
async function handleChangeEmail(event) {
  event.preventDefault();

  const response = await fetchData(event.target.action, {
    method: event.target.method,
    body: new FormData(event.target),
  });

  const data = await response.json();

  document.getElementById("message").innerText = data.message || "";
  document.getElementById("error").innerText = data.error || ""
}
django django-models django-templates
1个回答
0
投票

您的代码存在一些问题:
A) 函数always返回“电子邮件已更新”。
B) 对于

request.user.save()
错误的情况没有处理。

像这样改变它:

@login_required
def change_email(request):
    if request.method == 'GET':
        return JsonResponse({ 'message': 'No get request allowed' })

    email = request.POST['email']

    if email == request.user.email:
        return JsonResponse({ 'message': 'Email already saved' })        

    request.user.email = email
    try:
        request.user.save()
    except Exception as e:
        return JsonResponse({'error': str(e)}, status=500)
    
    return JsonResponse({ 'message': 'Email updated' })

这应该有助于提供有关所发生情况的更多信息。该代码距离完美还很远:它缺乏电子邮件验证、csrf 保护和处理 GET 请求的情况。您还应该添加适当的错误代码,例如

JsonResponse({'message': 'Email updated'}, status=200)

© www.soinside.com 2019 - 2024. All rights reserved.