Django中使用简历解析器,无法将提取技能保存到用户Profile模型
简历解析后无法保存到Profile模型的问题解决
问题背景
开发支持用户上传简历的网站,通过简历解析脚本提取技能后,无法将提取的信息保存到Profile模型,保存步骤报错。
错误原因
- 核心错误:代码中
resume = file_form.cleaned_data['resume']获取的是上传的文件对象,而非Profile模型实例。你试图给这个文件对象赋值Profile模型的字段(如name、skills)并调用save(),但文件对象不具备这些属性,直接导致报错。 - 字段名不匹配:模型中定义的是
company_name,但代码里使用了resume.company_names,会引发属性不存在的错误。 - 多文件上传逻辑矛盾:Profile与User是一对一关联关系,一个用户只能对应一个Profile实例,当前循环处理多个文件的逻辑会导致多次覆盖同一个Profile的内容,不符合业务逻辑(若需支持多简历,建议新增独立的Resume模型关联到Profile)。
修正后的views.py代码
def homepage(request): if request.method == 'POST': file_form = UploadResumeModelForm(request.POST, request.FILES, instance=request.user.profile) files = request.FILES.getlist('resume') resumes_data = [] if file_form.is_valid(): # 获取当前用户的Profile实例 profile = request.user.profile for file in files: try: # 解析简历文件 parser = ResumeParser(file.temporary_file_path()) data = parser.get_extracted_data() resumes_data.append(data) # 更新Profile字段 profile.name = data.get('name') profile.email = data.get('email') profile.mobile_number = data.get('mobile_number') profile.education = ', '.join(data.get('degree')) if data.get('degree') else None # 修正字段名:company_name而非company_names profile.company_name = data.get('company_names') profile.college_name = data.get('college_name') profile.designation = data.get('designation') profile.total_experience = data.get('total_experience') profile.skills = ', '.join(data.get('skills')) if data.get('skills') else None profile.experience = ', '.join(data.get('experience')) if data.get('experience') else None # 保存当前文件到Profile的resume字段(多文件会覆盖,若需多简历需调整模型) profile.resume = file profile.save() except IntegrityError: messages.warning(request, f'重复简历:{file.name}') return redirect('homepage') messages.success(request, '简历上传成功!') # 获取所有Profile数据用于展示 resumes = Profile.objects.all() context = {'resumes': resumes} return render(request, 'authentication/resume.html', context) else: form = UploadResumeModelForm() return render(request, 'authentication/resume.html', {'form': form})
额外建议
如果需要支持一个用户上传多份简历,建议新增独立的Resume模型,与Profile建立外键关联:
# models.py新增Resume模型 class Resume(models.Model): profile = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name='resumes') file = models.FileField(upload_to='resumes/') name = models.CharField(max_length=255, null=True, blank=True) email = models.CharField(max_length=255, null=True, blank=True) mobile_number = models.CharField(max_length=255, null=True, blank=True) education = models.CharField(max_length=255, null=True, blank=True) skills = models.CharField(max_length=1000, null=True, blank=True) company_name = models.CharField(max_length=1000, null=True, blank=True) college_name = models.CharField(max_length=1000, null=True, blank=True) designation = models.CharField(max_length=1000, null=True, blank=True) experience = models.CharField(max_length=1000, null=True, blank=True) total_experience = models.CharField(max_length=1000, null=True, blank=True) def __str__(self): return f"{self.profile.user.username}的简历"
对应的views.py逻辑也需要调整为创建Resume实例,而非更新Profile。
内容的提问来源于stack exchange,提问作者KipronoKirui
相关产品推荐
相关产品推荐

