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

Django views.py对比不同模型实现职位匹配页面无结果问题咨询

问题修复方案

核心问题梳理

  • 未获取当前登录用户的User_profile实例:直接对比模型类的字段属性而非当前用户的实际技能值,对比逻辑完全不生效
  • 匹配逻辑错误:
    1. 用==判断布尔值相等会把「用户和职位都不具备该技能」的情况判定为匹配,不符合需求
    2. 用elif分支判断,单个职位即使匹配多个技能也只会被统计一次,且同技能下多个职位会被字典的相同key覆盖
  • 上下文传递错误:直接将存储匹配结果的字典作为上下文传入模板,模板遍历字典时只会拿到键名(技能字符串),无法获取职位对象
  • 模型字段缺失:Job模型未定义created_at字段,模板调用该属性会报错

修复后的代码

views.py

from django.contrib.auth.decorators import login_required
from apps.job.models import Job
from apps.userprofile.models import User_profile

@login_required  # 要求用户登录才能访问该视图
def match_jobs(request):
    # 获取当前登录用户的个人资料实例
    user_profile = request.user.userprofile
    match_jobs = []
    # 列出所有需要匹配的技能字段
    skill_fields = ['product_management', 'web_development', 'user_experience', 'marketing', 'finance']
    
    for job in Job.objects.all():
        # 判断职位是否有任意技能和用户的技能匹配(均为True)
        for field in skill_fields:
            if getattr(user_profile, field) and getattr(job, field):
                match_jobs.append(job)
                break  # 避免同一个职位匹配多个技能时重复加入列表
    
    # 正确传递上下文,键名和模板中遍历的变量名一致
    return render(request, 'jobmatch.html', {'match_jobs': match_jobs})

Job.models.py 补充字段

class Job(models.Model):
    title = models.CharField(max_length=255)    
    location = models.CharField(max_length=255, blank=True, null=True)
    description = models.TextField()
    requirements = models.TextField(blank=True, null=True)
    product_management = models.BooleanField(default=False)
    web_development = models.BooleanField(default=False)
    user_experience = models.BooleanField(default=False)
    marketing = models.BooleanField(default=False)
    finance = models.BooleanField(default=False)
    # 补充模板用到的创建时间字段
    created_at = models.DateTimeField(auto_now_add=True)

jobmatch.html 无需改动,确保上下文传递正确即可正常渲染

内容的提问来源于stack exchange,提问作者dt123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:45:03