Как правильно связать комментарии с новостями в Django?

    blazer |   11.01.2016 |   14:48:09 |   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})

 

Ваши комментарии

Комментарии могут оставлять только зарегистрированые пользователи!

Disqus - комментарии

blog comments powered by Disqus