Не передается объект формы в шаблон django

Рейтинг: 0Ответов: 1Опубликовано: 08.03.2023

Всем привет, подскажите в чем может быть проблема, уже всю голову сломал. Не передается объект формы комментирования записей. Прикладываю код и стэк ошибок.

views.py:

@login_required
def add_comment(request, post_id):
    post = get_object_or_404(Post, id=post_id)
    comments = post.comments.all()
    if request.method == 'POST':
        # A comment was posted
        comment_form = CommentForm(data=request.POST)
        if comment_form.is_valid():
            # Create Comment object but don't save to database yet
            new_comment = comment_form.save(commit=False)
            # Assign the current post to the comment
            new_comment.post = post
            # Save the comment to the database
            new_comment.save()
        else:
            comment_form = CommentForm()
        return render(request,
                      'post/post_detail.html',
                      {'post': post,
                       'comments': comments,
                       'comment_form': comment_form})

post_detail.html:

{% extends "base.html" %}
{% load user_filters %}
{% load thumbnail %}
{% block title %}Пост {{post.text|truncatechars:30}}{% endblock %}
{% block content %}
      <div class="row">
        <aside class="col-12 col-md-3">
          <ul class="list-group list-group-flush">
            <li class="list-group-item">
              Дата публикации: {{ post.pub_date|date:"d E Y" }}
            </li>
              <li class="list-group-item">
                Группа: {{ post.group }}
                {% if post.group %}
                <a href="{% url 'post_app:post_group' post.group.slug %}">
                  все записи группы
                </a>
                {% endif %}
              </li>
              <li class="list-group-item">
                Автор: {{ post.author.get_full_name }}
              </li>
              <li class="list-group-item d-flex justify-content-between align-items-center">
              Всего постов автора:  <span >{{post_user.count}}</span>
            </li>
            <li class="list-group-item">
              <a href="{% url 'post_app:profile' post.author%}">
                все посты пользователя
              </a>
            </li>
          </ul>
        </aside>
        <article class="col-12 col-md-9">
        {% thumbnail post.image "1000x350" crop="center" upscale=True as im %}
            <img class="card-img my-2" src="{{ im.url }}">
        {% endthumbnail %}
          <p>
           {{post.text}}
          </p>
            {% if user.is_authenticated %}
                  <div class="card my-4">
                    <h5 class="card-header">Добавить комментарий:</h5>
                    <div class="card-body">
                      <form method="post" action="{% url 'post_app:add_comment' post.id %}">
                        {% csrf_token %}
                        <div class="form-group mb-2">
                        {{ comment_form.text|addclass:"form-control"}}
                        </div>
                        <button type="submit" class="btn btn-primary">Отправить</button>
                      </form>
                    </div>
                  </div>
            {% endif %}

        {% for comment in comments %}
            <div class="media mb-4">
                <div class="media-body">
                  <h5 class="mt-0">
                    <a href="{% url 'post_app:profile' comment.author.username %}">
                      {{ comment.author.username }}
                    </a>
                  </h5>
                    <p>
                     {{ comment.text }}
                    </p>
                  </div>
                </div>
            {% endfor %}
          {% if user.is_authenticated %}
        <a class="btn btn-primary" href="{% url 'post_app:post_edit' post.id %}">
                Редактировать
        </a>
        {% endif %}
        </article>

      </div>
{% endblock %}

forms.py

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ('body',)
        labels = {
            'text': 'Текст',
        }
        help_texts = {
            'text': 'Текст нового комментария',
        }

user_filters.py

@register.filter
def addclass(field, css):
    return field.as_widget(attrs={'class': css})

models.py

class Comment(models.Model):
    post = models.ForeignKey(Post, verbose_name='Пост', on_delete=models.CASCADE)
    author = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        verbose_name='Автор'
    )
    body = models.TextField(
        'Текст комментария',
        help_text='Комментировать запись'
    )

    created = models.DateTimeField(
        'Дата публикации',
        auto_now_add=True
    )

    def __str__(self):
        return self.body

urls.py

urlpatterns = [
    path('', index, name='home'),
    # Профайл пользователя
    path('profile/<str:username>/', profile, name='profile'),
    path('posts/<int:post_id>/', post_detail, name='post_detail'),
    path('group/<slug:slug>/', group_posts, name='post_group'),
    path('create/', post_create, name='post_create'),
    path('posts/<int:post_id>/edit/', post_edit, name='post_edit'),
    path('posts/<int:post_id>/comment', add_comment, name='add_comment'),
]

handler404 = 'core.views.page_not_found'

При переходе по адресу http://127.0.0.1:8000/posts/37/ - возникает следующая ошибка:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/posts/37/

Django Version: 3.2.8
Python Version: 3.10.0
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'post',
 'users.apps.UsersConfig',
 'core.apps.CoreConfig',
 'about.apps.AboutConfig',
 'sorl.thumbnail']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']


Template error:
In template /Users/egor/Desktop/Develop/Dev/simple_social_media/myroz/templates/base.html, error at line 0
   'str' object has no attribute 'as_widget'
   1 : <!DOCTYPE html>
   2 : <html lang="ru">
   3 :   <head>
   4 :     {% load static %}
   5 :     <meta name="viewport" content="width=device-width, initial-scale=1">
   6 :     <link rel="icon" href="{% static 'img/logo.png' %}" type="image">
   7 :     <link rel="apple-touch-icon" sizes="180x180" href="img/fav/apple-touch-icon.png">
   8 :     <link rel="icon" type="image/png" sizes="32x32" href="img/fav/favicon-32x32.png">
   9 :     <link rel="icon" type="image/png" sizes="16x16" href="img/fav/favicon-16x16.png">
   10 :     <meta name="msapplication-TileColor" content="#000">


Traceback (most recent call last):
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/venv/lib/python3.10/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/venv/lib/python3.10/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/myroz/post/views.py", line 84, in post_detail
    return render(request, 'post/post_detail.html', context)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/venv/lib/python3.10/site-packages/django/shortcuts.py", line 19, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/venv/lib/python3.10/site-packages/django/template/loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/venv/lib/python3.10/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/venv/lib/python3.10/site-packages/django/template/base.py", line 170, in render
    return self._render(context)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/venv/lib/python3.10/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/venv/lib/python3.10/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/venv/lib/python3.10/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/venv/lib/python3.10/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/venv/lib/python3.10/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/venv/lib/python3.10/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/venv/lib/python3.10/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/venv/lib/python3.10/site-packages/django/template/loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/venv/lib/python3.10/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/venv/lib/python3.10/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/venv/lib/python3.10/site-packages/django/template/defaulttags.py", line 312, in render
    return nodelist.render(context)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/venv/lib/python3.10/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/venv/lib/python3.10/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/venv/lib/python3.10/site-packages/django/template/base.py", line 988, in render
    output = self.filter_expression.resolve(context)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/venv/lib/python3.10/site-packages/django/template/base.py", line 698, in resolve
    new_obj = func(obj, *arg_vals)
  File "/Users/egor/Desktop/Develop/Dev/simple_social_media/myroz/core/templatetags/user_filters.py", line 9, in addclass
    return field.as_widget(attrs={'class': css})

Exception Type: AttributeError at /posts/37/
Exception Value: 'str' object has no attribute 'as_widget'

Ответы

▲ 0

ты в шаблоне передаешь

  {{ comment_form.text|addclass:"form-control"}}

а в модели с которой работает форма поле для ввода текста называется body в итоге когда ты пытаешься вызвать фильтр, то в качестве аргумента передаешь не поле у которого можешь получить виджет, а строку и в фильтре происходит ошибка, так как у переданного параметра не метода as_widget