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})