You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 01:45:36