Форма комментариев Django не отправляет данные [ERROR: объект function' не имеет атрибута 'objects].

У меня есть форма комментария на странице поста для отправки пользовательского комментария. Я постоянно получаю эту ошибку:

'function' object has no attribute 'objects'

Полное отслеживание:

Traceback (most recent call last):
File "C:\Users\Steve Njuguna\Desktop\MoringaCore\Django-Instagram-Clone\env\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\Users\Steve Njuguna\Desktop\MoringaCore\Django-Instagram-Clone\env\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Steve Njuguna\Desktop\MoringaCore\Django-Instagram-Clone\env\lib\site-packages\django\contrib\auth\decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "C:\Users\Steve Njuguna\Desktop\MoringaCore\Django-Instagram-Clone\App\views.py", line 208, in AddComment
    comment_obj = Comment.objects.create(opinion = usercomment, author = user.id, post = post.id)

Exception Type: AttributeError at /post/1/comment
Exception Value: 'function' object has no attribute 'objects'

Большинство ответов на SO ссылаются на идентичную модель & имена функций, но это не мой случай. Вот моя модель:

class Comment(models.Model):
    opinion = models.CharField(max_length=2200, verbose_name='Comment', null=False)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)

    def __str__(self):
        return self.comment

    class Meta:
        verbose_name_plural = 'Comments'

Мое мнение

@login_required(login_url='Login')
def AddComment(request, id):
    post = Post.objects.filter(id=id)
    user = User.objects.get(username=request.user)
    if request.method == "POST":
        usercomment = request.POST['comment']
        comment_obj = Comment.objects.create(opinion = usercomment, author = user.id, post = post.id)
        comment_obj.save()
        messages.success(request, '✅ Your Comment Was Created Successfully!')
        return redirect('Home')
    else:
        messages.error(request, "⚠️ Your Comment Wasn't Created!")
        return redirect('Home')

И моя форма:

<form method="POST" action="{% url 'AddComment' post.id %}">
   {% csrf_token %}
   <div class="d-flex flex-row add-comment-section mt-4 mb-4">
      <img class="img-fluid img-responsive rounded-circle mr-2" src="{{ user.profile.profile_image.url }}" width="38">
      <textarea class="form-control mr-3" rows="1" name="comment" placeholder="Your Comment" required></textarea>
      <button class="btn btn-primary btn-lg" type="submit">Comment</button>
   </div>
</form>

И, наконец, мой URL:

urlpatterns = [
    path('post/<int:id>/comment', views.AddComment, name="AddComment"),
]

Удалите user = User.objects.get(username=request.user) из вашего представления, затем измените следующее:

comment_obj = Comment.objects.create(opinion = usercomment, author = user.id, post = post.id)

на это:

comment_obj = Comment.objects.create(opinion=usercomment, author=request.user, post=post)

Потому что вы не должны передавать id, где ищутся объекты (в ForeignKey нам нужен конкретный объект, а не его id).

Также измените следующее:

post = Post.objects.filter(id=id)

К этому:

post = Post.objects.get(id=id)

Потому что вам нужен конкретный объект, а не целый QuerySet из них.

Итак, первоначальная проблема с вашим вопросом была в этой строке

user = User.objects.get(username=request.user)

Я не знаю, как это вообще прошло через Django Orm, но оно намеренно вернуло что-то странное

Вам не нужно запрашивать объект user, потому что django запрашивает объект user по request.user самостоятельно.

Кроме того, django.db.models.Model.objects.filter() всегда возвращает QuerySet, который не является объектом Model, это набор объектов Model. Когда вы делаете запрос по первичному ключу и уверены, что существует экземпляр с таким id, используйте

 django.db.Model.objects.get(pk=pk)  # Post.objects.get(id=id) in your case

Примечание:. этот метод воспроизведет исключение ObjectDoesNotExist, если не будет найден объект с данным первичным ключом, имейте это в виду.

.
Вернуться на верх