Django使用CreateView报错:type object 'Task' has no attribute '_meta'
解决Django CreateView报错“type object 'Task' has no attribute '_meta'”
问题说明
使用Django的CreateView类时触发AttributeError: type object 'Task' has no attribute '_meta'错误,但ListView和DetailView可正常运行。
错误日志
System check identified no issues (0 silenced). July 20, 2022 - 22:38:33 Django version 3.2.12, using settings 'configs.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK. Internal Server Error: /task/create/ Traceback (most recent call last): File "C:\Users\mayank.shah\.virtualenvs\TASKS1-M_IXiD8r\lib\site-packages\django\core\handlers\exception.py", line 47, in inner response = get_response(request) File "C:\Users\mayank.shah\.virtualenvs\TASKS1-M_IXiD8r\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "C:\Users\mayank.shah\.virtualenvs\TASKS1-M_IXiD8r\lib\site-packages\django\views\generic\base.py", line 70, in view return self.dispatch(request, *args, **kwargs) File "C:\Users\mayank.shah\.virtualenvs\TASKS1-M_IXiD8r\lib\site-packages\django\views\generic\base.py", line 98, in dispatch return handler(request, *args, **kwargs) File "C:\Users\mayank.shah\.virtualenvs\TASKS1-M_IXiD8r\lib\site-packages\django\views\generic\edit.py", line 168, in get return super().get(request, *args, **kwargs) File "C:\Users\mayank.shah\.virtualenvs\TASKS1-M_IXiD8r\lib\site-packages\django\views\generic\edit.py", line 133, in get return self.render_to_response(self.get_context_data()) File "C:\Users\mayank.shah\.virtualenvs\TASKS1-M_IXiD8r\lib\site-packages\django\views\generic\edit.py", line 66, in get_context_data kwargs['form'] = self.get_form() File "C:\Users\mayank.shah\.virtualenvs\TASKS1-M_IXiD8r\lib\site-packages\django\views\generic\edit.py", line 32, in get_form form_class = self.get_form_class() File "C:\Users\mayank.shah\.virtualenvs\TASKS1-M_IXiD8r\lib\site-packages\django\views\generic\edit.py", line 101, in get_form_class return model_forms.modelform_factory(model, fields=self.fields) File "C:\Users\mayank.shah\.virtualenvs\TASKS1-M_IXiD8r\lib\site-packages\django\forms\models.py", line 563, in modelform_factory return type(form)(class_name, (form,), form_class_attrs) File "C:\Users\mayank.shah\.virtualenvs\TASKS1-M_IXiD8r\lib\site-packages\django\forms\models.py", line 261, in __new__ fields = fields_for_model( File "C:\Users\mayank.shah\.virtualenvs\TASKS1-M_IXiD8r\lib\site-packages\django\forms\models.py", line 150, in fields_for_model opts = model._meta AttributeError: type object 'Task' has no attribute '_meta'
Task模型代码
class Task(models.Model): user =models.ForeignKey(User,on_delete=models.SET_NULL,null=True,blank=True,related_name='usertasks') title = models.CharField(max_length=200,blank=False, null=False) description = models.TextField(null=True, blank=True) complete = models.BooleanField(default=False) create = models.DateTimeField(auto_now_add=True) def __str__(self): return self.title def get_absolute_url(self): return reverse('task-app:task', kwargs={'pk': self.pk}) def __unicode__(self): return self.title class Meta: ordering = ['-create']
TaskCreate视图代码
class TaskCreate(CreateView): model = Task # fields = "__all__" fields = ('title', 'description') # fields = ['title']#,'description','completed'] success_url= reverse_lazy('task-app:tasks')
排查与解决方案
这个错误核心原因是CreateView尝试生成ModelForm时,传入的Task并非有效的Django模型类,或者模型元数据未被正确加载。按以下步骤排查:
检查导入语句
确认视图文件中导入的Task是models.py中的模型类,而非其他同名类:from .models import Task避免从其他模块导入同名的非模型类。
验证模型继承
确认Task模型正确继承自django.db.models.Model,代码中已正确实现,但可再次检查拼写是否有误。重启开发服务器
Django开发服务器可能缓存了旧的模型数据,重启后可刷新元数据,解决缓存导致的异常。显式定义ModelForm
绕过CreateView自动生成表单的逻辑,手动定义ModelForm并关联到视图:from django.forms import ModelForm from django.views.generic.edit import CreateView from django.urls import reverse_lazy from .models import Task class TaskForm(ModelForm): class Meta: model = Task fields = ('title', 'description') class TaskCreate(CreateView): form_class = TaskForm success_url = reverse_lazy('task-app:tasks')这种方式可避免自动生成表单时的元数据加载问题。
内容的提问来源于stack exchange,提问作者Mayank Shah
相关产品推荐
相关产品推荐

