Не передается объект формы в шаблон django
Всем привет, подскажите в чем может быть проблема, уже всю голову сломал. Не передается объект формы комментирования записей. Прикладываю код и стэк ошибок.
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'
Источник: Stack Overflow на русском