Пытаюсь создать древовидные комментарии, но нигде не могу найти того, что мне нужно. Везде руководства какие-то размытые... Если есть подробный разбор создания комментариев, скиньте ссылку, пожалуйста. Пробовал и mptt, и threadedcomments подключить, не получилось(
Вообще вот нашёл неплохое руководство https://evileg.com/ru/post/14/ , но это тоже не совсем то.
Что мне нужно?
Есть страница (ОДНА) - с отзывами о сайте.
Нужно сделать такие комментарии на этой странице.
Вот до чего дошёл
models.py
class Review(models.Model):
shown_name = models.CharField(max_length=255, verbose_name="Отображаемое название")
name = models.CharField(max_length=255, verbose_name='Текст для формирования url')
slug = models.SlugField(verbose_name='url-адрес', unique=True)
class Comment(models.Model):
class Meta:
db_table = "comments"
path = ArrayField(models.IntegerField())
review = models.ForeignKey(Review)
author = models.CharField(max_length=30)
content = models.TextField('Комментарий')
pub_date = models.DateTimeField('Дата комментария', default=timezone.now)
def __unicode__(self):
return self.content[0:200]
def get_offset(self):
level = len(self.path) - 1
if level > 5:
level = 5
return level
def get_col(self):
level = len(self.path) - 1
if level > 5:
level = 5
return 12 - level
forms.py
from django import forms
from .models import Comment
class CommentForm(forms.Form):
parent_comment = forms.IntegerField(
widget=forms.HiddenInput,
required=False
)
comment_area = forms.CharField(
label="",
widget=forms.Textarea
)
urls.py
url(r'^reviews/$', views.get_comment, name='review'),
url(r'^comment/reviews/$', views.add_comment, name='add_comment'),
views.py (там, где закомментировано, не знаю как получить значения..
def get_comment(request, review_slug):
comment_form = CommentForm
review = get_object_or_404(Review, id=review_slug)
context = {}
context.update(csrf(request))
# author = review.comment_set.all()[0]
context['comments'] = review.comment_set.all().order_by('path')
# context['next'] = review.get_absolute_url()
context['form'] = comment_form
return render_to_response(template_name='pages/comment.html', context=context)
@require_http_methods(["POST"])
def add_comment(request):
form = CommentForm(request.POST)
review = get_object_or_404(Review)
if form.is_valid():
comment = Comment()
comment.path = []
# comment.author = auth.get_user(request)
comment.content = form.cleaned_data['comment_area']
comment.save()
try:
comment.path.extend(Comment.objects.get(id=form.cleaned_data['parent_comment']).path)
comment.path.append(comment.id)
except ObjectDoesNotExist:
comment.path.append(comment.id)
comment.save()
# return redirect(review.get_absolute_url())
html
{% for comment in comments %}
<a name="comment-{{ comment.id }}"></a>
<div class="row" id="{{ comment.id }}">
<div class="col-md-{{ comment.get_col }} col-md-offset-{{ comment.get_offset }}">
<div class="panel panel-default">
<div class="panel-heading">
<strong>{{ comment.author }}</strong>
{{ comment.pub_date }}
<a href="#comment-{{ comment.id }}">#</a>
</div>
<div class="panel-body">
<div>{{ comment.content|safe }}</div>
{% if form %}<a class="btn btn-default btn-xs pull-right"
onclick="return show_comments_form({{ comment.id }})">
{% bootstrap_icon "share-alt" %} Ответить</a>
{% endif %}
</div>
</div>
</div>
</div>
{% endfor %}
Всё делаю по примеру из ссылки, но сердцем чую, что что-то не то... Может, есть какой-то более простой способ это сделать?
Просто я с такими комментариями ещё не сталкивался, а пример толковый сложно найти...
Вообще мне ещёподсказали просто установить "parent_id" в комментарие и проходится циклом по нему, находя всех потомков....