TypeError: 'Post' object is not callable
TypeError: 'Post' object is not callable
我是 Django 的新手,我的项目中一直出现此错误。我曾尝试通过检查类似问题来修复它,但我一直在努力寻找问题所在。
这是 models.py 文件的代码。
class Post(models.Model):
publisher = models.ForeignKey(User, related_name='posts_published', on_delete=models.CASCADE)
category = models.ForeignKey(Category, related_name='posts', on_delete=models.CASCADE)
subject = models.CharField(max_length=200)
slug = models.SlugField(max_length=200, unique=True)
overview = models.TextField()
published = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['-published']
def __str__(self):
return self.subject
class Module(models.Model):
post = models.ForeignKey(Post, related_name='modules', on_delete=models.CASCADE)
subject = models.CharField(max_length=200)
add_desc = models.TextField(blank=True)
order = OrderField(blank=True, for_fields=['post'])
class Meta:
ordering = ['order']
def __str__(self):
return f'{self.order}. {self.subject}'
来自 views.py
的片段
class PostUpdateViewModel(TemplateResponseMixin, View):
template_name = 'publications/manage/module/formset.html'
post = None
def get_formset(self, data=None):
return PostsModuleFields(instance=self.post, data=data)
def dispatch(self, request, pk):
self.post = get_object_or_404(Post, id=pk, publisher=request.user)
return super().dispatch(request, pk)
def get(self, request, *args, **kwargs):
formset = self.get_formset()
return self.render_to_response({'post': self.post, 'formset': formset})
def post(self, request, *args, **kwargs):
formset = self.get_formset(data=request.POST)
if formset.is_valid():
formset.save()
return redirect('posts_list_merge')
return self.render_to_response({'post': self.post, 'formset': formset})
我的formset.html
{% extends "home.html" %}
{% block title %}
Edit "{{ post.subject }}"
{% endblock %}
{% block content %}
<h1>Edit "{{ post.subject }}"</h1>
<div class="module">
<h2>Course modules</h2>
<form method="post">
{{ formset }}
{{ formset.management_form }}
{% csrf_token %}
<input type="submit" value="Save modules">
</form>
</div>
{% endblock %}
完整追溯:
Traceback (most recent call last):
File "E:\Flaminhoe\Projects\DIPLOMA\ckmsVirtualEnv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "E:\Flaminhoe\Projects\DIPLOMA\ckmsVirtualEnv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "E:\Flaminhoe\Projects\DIPLOMA\ckmsVirtualEnv\lib\site-packages\django\views\generic\base.py", line 70, in view
return self.dispatch(request, *args, **kwargs)
File "E:\Flaminhoe\Projects\DIPLOMA\ckmsVirtualEnv\ckmsProject\publications\views.py", line 61, in dispatch
return super().dispatch(request, pk)
File "E:\Flaminhoe\Projects\DIPLOMA\ckmsVirtualEnv\lib\site-packages\django\views\generic\base.py", line 98, in dispatch
return handler(request, *args, **kwargs)
Exception Type: TypeError at /post/1/module/
Exception Value: 'Post' object is not callable
有没有人知道为什么会发生此错误?
发生这种情况是因为您的对象被称为 post
,因此 class 实例具有 post
作为模型中 Post
对象的实例。
但是,您在对视图执行 POST
请求后尝试访问 post
函数,并且 post
是数据库对象,而不是函数,因此您可以叫它。
最简单的修复方法是将视图中的对象更改为 object
,这与其他 django 视图一致,并且可以随意在模板上下文中调用它 post
。
所以你的视图会变成这样;
class PostUpdateViewModel(TemplateResponseMixin, View):
template_name = 'publications/manage/module/formset.html'
object = None
def get_formset(self, data=None):
return PostsModuleFields(instance=self.object, data=data)
def dispatch(self, request, pk):
self.object = get_object_or_404(Post, id=pk, publisher=request.user)
return super().dispatch(request, pk)
def get(self, request, *args, **kwargs):
formset = self.get_formset()
return self.render_to_response({'post': self.object, 'formset': formset})
def post(self, request, *args, **kwargs):
formset = self.get_formset(data=request.POST)
if formset.is_valid():
formset.save()
return redirect('posts_list_merge')
return self.render_to_response({'post': self.object, 'formset': formset})
我是 Django 的新手,我的项目中一直出现此错误。我曾尝试通过检查类似问题来修复它,但我一直在努力寻找问题所在。
这是 models.py 文件的代码。
class Post(models.Model):
publisher = models.ForeignKey(User, related_name='posts_published', on_delete=models.CASCADE)
category = models.ForeignKey(Category, related_name='posts', on_delete=models.CASCADE)
subject = models.CharField(max_length=200)
slug = models.SlugField(max_length=200, unique=True)
overview = models.TextField()
published = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['-published']
def __str__(self):
return self.subject
class Module(models.Model):
post = models.ForeignKey(Post, related_name='modules', on_delete=models.CASCADE)
subject = models.CharField(max_length=200)
add_desc = models.TextField(blank=True)
order = OrderField(blank=True, for_fields=['post'])
class Meta:
ordering = ['order']
def __str__(self):
return f'{self.order}. {self.subject}'
来自 views.py
的片段class PostUpdateViewModel(TemplateResponseMixin, View):
template_name = 'publications/manage/module/formset.html'
post = None
def get_formset(self, data=None):
return PostsModuleFields(instance=self.post, data=data)
def dispatch(self, request, pk):
self.post = get_object_or_404(Post, id=pk, publisher=request.user)
return super().dispatch(request, pk)
def get(self, request, *args, **kwargs):
formset = self.get_formset()
return self.render_to_response({'post': self.post, 'formset': formset})
def post(self, request, *args, **kwargs):
formset = self.get_formset(data=request.POST)
if formset.is_valid():
formset.save()
return redirect('posts_list_merge')
return self.render_to_response({'post': self.post, 'formset': formset})
我的formset.html
{% extends "home.html" %}
{% block title %}
Edit "{{ post.subject }}"
{% endblock %}
{% block content %}
<h1>Edit "{{ post.subject }}"</h1>
<div class="module">
<h2>Course modules</h2>
<form method="post">
{{ formset }}
{{ formset.management_form }}
{% csrf_token %}
<input type="submit" value="Save modules">
</form>
</div>
{% endblock %}
完整追溯:
Traceback (most recent call last):
File "E:\Flaminhoe\Projects\DIPLOMA\ckmsVirtualEnv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "E:\Flaminhoe\Projects\DIPLOMA\ckmsVirtualEnv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "E:\Flaminhoe\Projects\DIPLOMA\ckmsVirtualEnv\lib\site-packages\django\views\generic\base.py", line 70, in view
return self.dispatch(request, *args, **kwargs)
File "E:\Flaminhoe\Projects\DIPLOMA\ckmsVirtualEnv\ckmsProject\publications\views.py", line 61, in dispatch
return super().dispatch(request, pk)
File "E:\Flaminhoe\Projects\DIPLOMA\ckmsVirtualEnv\lib\site-packages\django\views\generic\base.py", line 98, in dispatch
return handler(request, *args, **kwargs)
Exception Type: TypeError at /post/1/module/
Exception Value: 'Post' object is not callable
有没有人知道为什么会发生此错误?
发生这种情况是因为您的对象被称为 post
,因此 class 实例具有 post
作为模型中 Post
对象的实例。
但是,您在对视图执行 POST
请求后尝试访问 post
函数,并且 post
是数据库对象,而不是函数,因此您可以叫它。
最简单的修复方法是将视图中的对象更改为 object
,这与其他 django 视图一致,并且可以随意在模板上下文中调用它 post
。
所以你的视图会变成这样;
class PostUpdateViewModel(TemplateResponseMixin, View):
template_name = 'publications/manage/module/formset.html'
object = None
def get_formset(self, data=None):
return PostsModuleFields(instance=self.object, data=data)
def dispatch(self, request, pk):
self.object = get_object_or_404(Post, id=pk, publisher=request.user)
return super().dispatch(request, pk)
def get(self, request, *args, **kwargs):
formset = self.get_formset()
return self.render_to_response({'post': self.object, 'formset': formset})
def post(self, request, *args, **kwargs):
formset = self.get_formset(data=request.POST)
if formset.is_valid():
formset.save()
return redirect('posts_list_merge')
return self.render_to_response({'post': self.object, 'formset': formset})