实现django-progressbarupload时遇TypeError:'MediaDefiningClass'对象不可迭代
解决django-progressbarupload集成时的
TypeError: 'MediaDefiningClass' object is not iterable错误 这个错误的核心原因是你在Admin注册环节搞混了模型类和Admin配置类的关系,而且两者同名导致了变量覆盖。
问题分析
你从accounts.models导入了模型UserProfile,但紧接着又定义了一个同名的UserProfile(admin.ModelAdmin)类——这就导致后面调用admin.site.register(UserProfile)时,传入的其实是你定义的Admin配置类,而非真正的模型类。Django尝试遍历这个Admin类来处理模型逻辑,但Admin类的元类是MediaDefiningClass,它不支持迭代操作,所以抛出了这个错误。
修正后的代码
把Admin配置类重命名,并且注册时同时传入模型类和对应的Admin配置类:
from django.contrib import admin from accounts.models import UserProfile # 重命名Admin类,避免和模型类同名冲突 class UserProfileAdmin(admin.ModelAdmin): change_form_template = 'progressbarupload/change_form.html' add_form_template = 'progressbarupload/change_form.html' # 正确注册:第一个参数是模型类,第二个是对应的Admin配置类 admin.site.register(UserProfile, UserProfileAdmin)
关键说明
- Django的
admin.site.register()方法,第一个参数必须是模型类,第二个参数是可选的Admin配置类(用于自定义Admin页面行为)。 - 永远不要让Admin配置类和模型类同名,这会导致变量覆盖,引发这类难以排查的低级错误。
内容的提问来源于stack exchange,提问作者Jason Howard
相关产品推荐
相关产品推荐

