Django中ProfileUser数据未保存及资料不显示问题求助
问题描述
首次注册后系统跳转至资料填写表单,可输入邮箱、头像、简介及社交平台链接,涉及User与ProfileUser两个模型。提交信息后出现以下问题:
- 个人主页仅显示邮箱,其余填写内容均不展示
- 进入编辑页面时表单为空
- Admin面板仅自动关联了
User,ProfileUser的其他字段无数据
以下是相关代码及修复方案:
注册时自动创建关联代码
profile = ProfileUser.objects.create(user=new_user)
models.py
class ProfileUser(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True) img = models.ImageField(null=True, blank=True, upload_to='static/images/', validators=[img__size]) birthday = models.DateField(blank=True, null=True) about = models.TextField(max_length=1000, null=True) # 社交平台 twitter = models.URLField(null=True, blank=True) facebook = models.URLField(null=True, blank=True) instagram = models.URLField(null=True, blank=True) telegram = models.URLField(null=True, blank=True) vk = models.URLField(null=True, blank=True) reddit = models.URLField(null=True, blank=True) github = models.URLField(null=True, blank=True) def __str__(self): return 'Profile for user {}'.format(self.user.username)
forms.py
class UserEditForm(ModelForm): class Meta: model = User fields = ['email'] class ProfileEditForm(ModelForm): class Meta: model = ProfileUser fields = ['birthday', 'img', 'about', 'twitter', 'facebook','instagram', 'telegram','vk','reddit', 'github']
views.py 创建资料(原代码)
def createProfile(request): UserForm = UserEditForm() ProfileForm = ProfileEditForm() if request.method == 'POST': print(request.POST) UserForm = UserEditForm(request.POST) ProfileForm = ProfileEditForm(request.POST) if ProfileForm.is_valid(): UserForm.save() ProfileForm.save() return redirect('base:home') context = {'UserForm': UserForm,'ProfileForm': ProfileForm} return render(request, 'base/profileForm.html', context)
views.py 更新资料(原代码)
@login_required(login_url='base:login') def updateProfile(request,pk): user = User.objects.get(id=pk) UserForm = UserEditForm(instance=user) ProfileForm = ProfileEditForm(instance=user) if request.method == 'POST': ProfileForm = ProfileEditForm(request.POST,instance=user) UserForm = UserEditForm(request.POST,instance=user) if UserForm.is_valid(): UserForm.save() ProfileForm.save() return redirect('base:home') context = {'user': user,'UserForm': UserForm,'ProfileForm': ProfileForm} return render(request, 'base/profileForm.html', context)
profileForm.html
{% block content %} <form class="login__form" method='POST' action="." enctype="multipart/form-data"> {% csrf_token %} {{ProfileForm.media}} {{UserForm.as_p}} {{ProfileForm.as_p}} <input type="submit" class="btn btn-min" value="Сохранить"> </form> {% endblock content %}
修复方案
1. 修复创建资料视图(createProfile)
原代码未关联当前用户到ProfileUser、未处理文件上传,且UserForm未指定实例会创建新用户。修复后代码:
from django.contrib.auth.decorators import login_required @login_required(login_url='base:login') def createProfile(request): # 获取或创建当前用户的ProfileUser实例 profile, created = ProfileUser.objects.get_or_create(user=request.user) UserForm = UserEditForm(instance=request.user) ProfileForm = ProfileEditForm(instance=profile) if request.method == 'POST': UserForm = UserEditForm(request.POST, instance=request.user) # 传入request.FILES处理图片上传 ProfileForm = ProfileEditForm(request.POST, request.FILES, instance=profile) # 同时验证两个表单有效性 if UserForm.is_valid() and ProfileForm.is_valid(): UserForm.save() ProfileForm.save() return redirect('base:home') context = {'UserForm': UserForm,'ProfileForm': ProfileForm} return render(request, 'base/profileForm.html', context)
2. 修复更新资料视图(updateProfile)
原代码错误地将User实例传入ProfileForm,且未处理文件上传。修复后代码:
@login_required(login_url='base:login') def updateProfile(request,pk): user = User.objects.get(id=pk) # 获取用户关联的ProfileUser实例 profile = ProfileUser.objects.get(user=user) UserForm = UserEditForm(instance=user) ProfileForm = ProfileEditForm(instance=profile) if request.method == 'POST': UserForm = UserEditForm(request.POST, instance=user) ProfileForm = ProfileEditForm(request.POST, request.FILES, instance=profile) if UserForm.is_valid() and ProfileForm.is_valid(): UserForm.save() ProfileForm.save() return redirect('base:home') context = {'user': user,'UserForm': UserForm,'ProfileForm': ProfileForm} return render(request, 'base/profileForm.html', context)
3. 额外配置
- 在
settings.py中配置媒体文件路径(支持图片上传):
MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
- 在项目根
urls.py中添加媒体文件路由:
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # 现有路由 ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
内容的提问来源于stack exchange,提问作者Adfegecy
相关产品推荐
相关产品推荐

