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

Django view.py调用函数报错:VacanciesView调用get_context_data提示self未定义

问题解决:name 'self' is not defined 错误

错误根源

你写的VacanciesView是函数视图,但get_context_data是Django基于类的视图(CBV)的专属方法——函数视图里不存在self这个实例对象,同时你把get_context_data写成了独立函数,既不属于类的方法,也没法通过super()调用父类逻辑,所以触发报错。

两种可行解决方案

方案一:改为基于类的视图(推荐)

把VacanciesView改成继承TemplateView的类视图,让get_context_data成为类的方法,就能正常使用self和父类方法:

from django.views.generic import TemplateView
from .models import Navigate

# 假设你的get_vacancies函数已实现
def get_vacancies():
    pass

class VacanciesView(TemplateView):
    template_name = 'main/vacancies.html'

    def get_context_data(self, **kwargs):
        # 获取父类的基础上下文
        context = super().get_context_data(**kwargs)
        # 添加导航数据
        context['navigate_results'] = Navigate.objects.all()
        # 添加排序后的职位数据
        context['vacancies'] = sorted(get_vacancies(), key=lambda item: item["published_at"][:10])
        return context

方案二:保留函数视图,直接合并上下文

如果不想切换到类视图,直接在函数里处理所有需要传递给模板的变量即可:

from django.shortcuts import render
from .models import Navigate

def get_vacancies():
    pass

def VacanciesView(request):
    navigate_results = Navigate.objects.all()
    # 处理职位排序逻辑
    vacancies = sorted(get_vacancies(), key=lambda item: item["published_at"][:10])
    # 合并所有上下文变量
    context_vac = {
        'navigate_results': navigate_results,
        'vacancies': vacancies
    }
    return render(request, 'main/vacancies.html', context_vac)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:40:26