Django报错AttributeError: 'function'对象无as_view属性
问题原因
AttributeError: 'function' object has no attribute 'as_view' 触发的核心逻辑是:urls.py中引用的views.QuizResultsView是函数对象而非类对象,函数不存在类视图专属的as_view()方法。
常见触发原因有两个:
- views.py中定义完
QuizResultsView类后,存在同名函数(多为旧版函数视图遗留代码),后者覆盖了类定义,导入到urls时实际拿到的是函数。 method_decorator使用不兼容:Django 2.1之前的版本不支持直接给method_decorator传入装饰器列表,这种写法会导致装饰器返回函数替代原类,触发报错。
修复步骤
- 先排查同名覆盖问题
在views.py中全局搜索QuizResultsView,如果存在def QuizResultsView(...)形式的同名函数,直接删除或重命名该函数即可。 - 修复装饰器兼容性问题
如果不存在同名函数,调整装饰器写法,不要直接传装饰器列表,改成嵌套装饰器形式,兼容所有Django版本:
from django.utils.decorators import method_decorator from django.contrib.auth.decorators import login_required # 分别装饰dispatch方法,替代原来的列表传参 @method_decorator(login_required, name='dispatch') @method_decorator(teacher_required, name='dispatch') class QuizResultsView(DetailView): model = Quiz context_object_name = 'quiz' template_name = 'classroom/teachers/quiz_results.html' # 其余类逻辑保持不变
同时确认你导入的method_decorator来自django.utils.decorators,不要导入其他第三方库的同名方法。
额外代码问题修复
你当前视图代码还有两个会触发运行错误的隐患,需要同步修改:
get_context_data方法中直接使用course_slug、quiz_slug变量会触发NameError,路由参数必须从self.kwargs中读取,且重复查询Quiz的冗余代码可以删除:
def get_context_data(self, **kwargs): # 先调用父类方法拿到默认上下文 context = super().get_context_data(**kwargs) quiz = self.get_object() # 从路由参数中读取course_slug course = Course.objects.get(slug=self.kwargs['course_slug']) taken_quizzes = quiz.taken_quizzes.select_related('student__user').order_by('-date') total_taken_quizzes = taken_quizzes.count() quiz_score = quiz.taken_quizzes.aggregate(average_score=Avg('score')) context.update({ 'taken_quizzes': taken_quizzes, 'total_taken_quizzes': total_taken_quizzes, 'quiz_score': quiz_score, 'total_questions':quiz.questions.count() }) return context
get_queryset方法中仅读取了self.kwargs的参数但没有做任何过滤逻辑,如果需要按传入的course、quiz slug过滤结果,需要补充对应的过滤条件,否则仅返回当前用户关联的所有Quiz。
内容的提问来源于stack exchange,提问作者Destiny Franks
相关产品推荐
相关产品推荐

