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

Django创建JobPost时报'JobPost' object has no attribute 'job_type'如何解决?

问题说明

我编写了一个simple view用于创建自定义职位并发布到job_portal,但遇到了下述报错。我当前在处理多对多字段,已经查阅过官方文档,但set方法似乎无法正常运行,我也附上了报错栈,报错提及的外键我已经设置为null,却仍出现这个奇怪的错误,提前感谢大家的帮助。

问题代码
def create_job(request):
    company_ = Company.objects.values_list('name', flat=True)

    if request.method == 'POST':
        # getting company by name for reference

        job_title = request.POST['job_title']
        company_name = request.POST['company_name']
        company = get_object_or_404(Company, name__iexact=company_name)
        address = request.POST.get('street_addr')
        city = request.POST['city']
        state = request.POST['state']
        country = request.POST['country']
        zip_ = request.POST.get('zip_code')
        skill_names = request.POST.getlist('skill_name')
        start_salary = request.POST.get('salary_start')
        end_salary = request.POST.get('salary_end')

        # create job skills if not already present inside DB
        print(skill_names)
        skill_list = []
        for skill in skill_names:
            skill_nam, created = Skillset.objects.get_or_create(skill_name__iexact=skill,defaults={
                'skill_name' : skill
            })
            skill_list.append(skill_nam)


        job_loc = JobLocation(address=address, city=city,
                              state=state, country=country, zip_code=zip_)
        job_loc.save()
        job_descrip = request.POST['job_descrip']

        job_skill_ = request.POST.getlist('job_skill_level')

        job_pst = JobPost(title=job_title, 
                          cmpny_name=company, job_description=job_descrip, salary_start=start_salary,salary_end=end_salary)

        job_pst.job_posters.set(request.user) <--- i am getting error here 
        job_pst.save()

        #skill_list has skill names
        job_skill_set = []
        for job_skill_name, job_level in zip(skill_list, job_skill_):
            skil_set = Skillset.objects.filter(skill_name=job_skill_name)
            job_skillset = Job_Skillset(job_post=job_pst, skill_level=job_level)
            job_skillset.skill.set(skil_set)
            job_skill_set.append(job_skillset)

        Job_Skillset.objects.bulk_create(job_skill_set)
        messages.add_message(request,messages.SUCCESS,'Job post successfully submitted!')
        return redirect('/dashboard/')
    return render(request, 'company/company_entry.html', context={
        'contxt': 'job_contxt',
        'company': company_,
        # 'skills_req': job_skill,

    })
报错信息
Traceback (most recent call last):
  File "C:\Users\atifs\Documents\job_portal\jobportal-env\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\atifs\Documents\job_portal\jobportal-env\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\atifs\Documents\job_portal\jobportal\job_management\views.py", line 60, in create_job
    job_pst.job_posters.set(request.user)
  File "C:\Users\atifs\Documents\job_portal\jobportal-env\lib\site-packages\django\db\models\fields\related_descriptors.py", line 536, in __get__
    return self.related_manager_cls(instance)
  File "C:\Users\atifs\Documents\job_portal\jobportal-env\lib\site-packages\django\db\models\fields\related_descriptors.py", line 851, in __init__
    raise ValueError('"%r" needs to have a value for field "%s" before '
  File "C:\Users\atifs\Documents\job_portal\jobportal-env\lib\site-packages\django\db\models\base.py", line 521, in __repr__
    return '<%s: %s>' % (self.__class__.__name__, self)
  File "C:\Users\atifs\Documents\job_portal\jobportal\job_management\models.py", line 24, in __str__
    return str(self.job_type)

Exception Type: AttributeError at /create_job/
Exception Value: 'JobPost' object has no attribute 'job_type'
解决方案
  • 多对多字段的set方法要求主表对象已经存入数据库、有主键ID才能调用,你当前代码先执行set再执行save顺序颠倒,调换两行位置即可。另外set方法要求传入可迭代对象,如果你只需要关联单个用户,要么写成job_pst.job_posters.set([request.user]),要么直接用更适配单对象添加的add方法:job_pst.job_posters.add(request.user)。
  • 你的JobPost模型的__str__方法返回了不存在的job_type字段,要么在JobPost模型定义中补充job_type字段,要么修改__str__方法返回已有的字段,比如return self.title即可解决属性报错。
  • 额外优化:你后续创建Job_Skillset时先调用set再执行bulk_create的操作是无效的,bulk_create不会触发多对多字段的关联保存,你可以在bulk_create执行完成后再遍历处理多对多关联,或者直接将Job_Skillset的skill字段修改为外键(单条技能关联记录对应单个技能,不需要多对多)更合理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:54:02