Как правильно связать комментарии с новостями в Django?
Делал кое какие изменения на своем блоге-практикуме и после этого перестали работать комментарии. Комментарии делал давно и все работало прекрасно. Но после изменения кода в views.py кое что сломал и кооментарии перестали добавляться и выводится на сайт.
В этом посте постараюсь описать суть причины проблемы и ее решение.
Написал модель комментариев
class Comments(models.Model):
class Meta():
db_table = 'comments'
verbose_name = 'Комментарий'
verbose_name_plural = 'Комментарии'
comments_text = models.TextField(verbose_name='Текст комментария')
comments_blogpost = models.ForeignKey(BlogPost)
Написал код в views.py для получения всех записей постов из базы данных и фильтр комментариев.
def full_slug(reguest, slug):
comment_form = CommentForm
form = comment_form
comments = Comments.objects.filter()
te = get_object_or_404(BlogPost, slug=slug)
return render(reguest, 'full.html', {'te': te, 'form': form, 'comments': comments, 'username': auth.get_user(reguest).username})
Написал код добавление комментариев
def addcomment(reguest, one_id):
if reguest.POST and ('pause' not in reguest.session):
form = CommentForm(reguest.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.comments_blogpost = BlogPost.objects.get(id=one_id)
form.save() # Сохраняем
return_path = reguest.META.get('HTTP_REFERER','/')
reguest.session.set_expiry(10) .
reguest.session['pause'] = True
return redirect(return_path)
Прописал маршрутизацию в urls.py
url(r'^(?P<slug>[-\w]+)/$', views.full_slug, name='full_slug'), # Вывод новостей
url(r'^addcomment/(?P<one_id>\d+)/$', views.addcomment), # Добавление коммента
В общем во вьюхе не могу прописать фильтр в этой строке comments = Comments.objects.filter() , чтоб коммент был закреплен к нужной новости. Сейчас получается, что во всех новостях выходят все комменты.
Пробовал так:
comments = Comments.objects.filter(comments_blogpost_id=slug), но получаю ошибку. Вывод должен быть только по id, типа такого
comments = Comments.objects.filter(comments_blogpost_id=one_id)
Но если использовать параметр one_id вместо slug, то будут ссылки в новостях типа такого full/22 т.е. не человекопонятный урл.
Решение.
Исправил код во views.py таким образом. Сначала нужно получить все записи блога из базы а потом уже фильтровать сами комментарии!
def full_slug(reguest, slug):
comment_form = CommentForm
form = comment_form
te = get_object_or_404(BlogPost, slug=slug)
comments = Comments.objects.filter(comments_blogpost=te)
return render(reguest, 'full.html', {'te': te, 'form': form, 'comments': comments, 'username': auth.get_user(reguest).username})
Ваши комментарии
Комментарии могут оставлять только зарегистрированые пользователи!