如何解决更新/更改 Django 中 ModelForm 中当前用户实例的信息
如何通过扩展一对一关系个人资料页面来编辑用户的用户实例信息(名字、姓氏、电子邮件)。下面我的代码没有给我任何错误,也没有为用户更新我在数据库中的给定信息。 User 模型不是我创建的,但我使用 django.contrib.auth.models.User 我也不想使用 Django 的 UpdateView 类。任何帮助将不胜感激。
Django 版本
asgiref==3.3.1
Django==3.1.5
django-crispy-forms==1.10.0
Pillow==8.1.0
pytz==2020.5
sqlparse==0.4.1
代码:
users/forms.py
from django import forms
from django.contrib.auth.models import User
from .models import Profile
class UserUpdateForm(forms.ModelForm):
first_name = forms.CharField(max_length=30)
last_name = forms.CharField(max_length=30)
email = forms.EmailField()
class Meta:
model = User
fields = ['first_name','last_name','email']
class ProfileUpdateForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['image']
users/views.py
from django.shortcuts import render,redirect
from django.contrib.auth.decorators import login_required
from .forms import UserUpdateForm,ProfileUpdateForm
from django.contrib import messages
@login_required
def profile(request):
if request.POST == 'POST':
u_form = UserUpdateForm(request.POST,instance=request.user)
p_form = ProfileUpdateForm(request.POST,request.FILES,instance=request.user.profile)
if u_form.is_valid() and p_form.is_valid():
u_form.save()
p_form.save()
messages.success(request,"Your profile has been updated !")
return redirect('profile')
else:
u_form = UserUpdateForm(instance=request.user)
p_form = ProfileUpdateForm(instance=request.user.profile)
context = {
'title': "Profile",'act': 'profile','u_form': u_form,'p_form': p_form,}
return render(request,'users/profile.html',context)
users/profile.html
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block title %} {{ title }} {% endblock title %}
{% block content %}
<div class="content-section align-content-center">
<div class="media py-3">
<img src="{{ user.profile.image.url }}" alt="" class="rounded-circle img-thumbnail" height="10" width="180">
<div class="media-body">
<h2 class="account-heading pl-3">{{ user.get_full_name }}</h2>
<p class="text-secondary pl-3">{{ user.email }}</p>
</div>
</div>
<form action="" method="POST" enctype="multipart/form-data">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Profile Info</legend>
{{ u_form|crispy }}
{{ p_form|crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">Update</button>
</div>
</form>
</div>
{% endblock %}
解决方法
已解决
Bug 在 Profile 视图下方,我正在检查 request.POST == 'POST' 是否应该如下所示。由于 request.POST 返回一个 QuerySet 而不是字符串。
@login_required
def profile(request):
if request.method == 'POST':
u_form = UserUpdateForm(request.POST,instance=request.user)
p_form = ProfileUpdateForm(request.POST,request.FILES,instance=request.user.profile)
if u_form.is_valid() and p_form.is_valid():
u_form.save()
p_form.save()
messages.success(request,"Your profile has been updated !")
return redirect('profile')
else:
u_form = UserUpdateForm(instance=request.user)
p_form = ProfileUpdateForm(instance=request.user.profile)
context = {
'title': "Profile",'act': 'profile','u_form': u_form,'p_form': p_form,}
return render(request,'users/profile.html',context)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。