我想更改用户电子邮件(以及有关用户的其他信息)
所以我为它创建了一条路线,这是一个应该适用于更改电子邮件的最小示例:
@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 || ""
}
您的代码存在一些问题:
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)