Ошибка типа: объект ‘Post’ не вызывается

#django #django-views #django-templates #django-urls

#django #django-просмотры #django-шаблоны #django-urls

Вопрос:

Я новичок в 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:FlaminhoeProjectsDIPLOMAckmsVirtualEnvlibsite-packagesdjangocorehandlersexception.py", line 47, in inner
    response = get_response(request)
  File "E:FlaminhoeProjectsDIPLOMAckmsVirtualEnvlibsite-packagesdjangocorehandlersbase.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "E:FlaminhoeProjectsDIPLOMAckmsVirtualEnvlibsite-packagesdjangoviewsgenericbase.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "E:FlaminhoeProjectsDIPLOMAckmsVirtualEnvckmsProjectpublicationsviews.py", line 61, in dispatch
    return super().dispatch(request, pk)
  File "E:FlaminhoeProjectsDIPLOMAckmsVirtualEnvlibsite-packagesdjangoviewsgenericbase.py", line 98, in dispatch
    return handler(request, *args, **kwargs)

Exception Type: TypeError at /post/1/module/
Exception Value: 'Post' object is not callable
 

Есть ли у кого-нибудь какие-нибудь идеи, почему происходит эта ошибка?

Ответ №1:

Это происходит потому, что ваш объект вызывается post так, что экземпляр класса имеет 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})