Форум программистов, компьютерный форум, киберфорум
Python: Django
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1

Древовидные комментарии

19.02.2019, 18:02. Показов 4520. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь создать древовидные комментарии, но нигде не могу найти того, что мне нужно. Везде руководства какие-то размытые... Если есть подробный разбор создания комментариев, скиньте ссылку, пожалуйста. Пробовал и mptt, и threadedcomments подключить, не получилось(

Вообще вот нашёл неплохое руководство https://evileg.com/ru/post/14/ , но это тоже не совсем то.

Что мне нужно?
Есть страница (ОДНА) - с отзывами о сайте.

Нужно сделать такие комментарии на этой странице.

Вот до чего дошёл
models.py
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
Python
1
2
    url(r'^reviews/$', views.get_comment, name='review'),
    url(r'^comment/reviews/$', views.add_comment, name='add_comment'),
views.py (там, где закомментировано, не знаю как получить значения..
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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
Кликните здесь для просмотра всего текста
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{% 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>&nbsp;&nbsp;
                        {{ 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" %}&nbsp;&nbsp;Ответить</a>
                        {% endif %}
                    </div>
                </div>
            </div>
        </div>
 {% endfor %}


Всё делаю по примеру из ссылки, но сердцем чую, что что-то не то... Может, есть какой-то более простой способ это сделать?
Просто я с такими комментариями ещё не сталкивался, а пример толковый сложно найти...
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.02.2019, 18:02
Ответы с готовыми решениями:

Древовидные комментарии в django 2.0
Здравствуйте, не совсем понятен алгоритм подключения древовидных комментариев в django 2 Есть...

Древовидные комментарии
Подскажите пожалуйста, как можно реализовать комментарии в виде дерева? Т.е. что бы комментарии можно было комментировать. Есть таблица...

Древовидные комментарии
Здравствуйте! Сделал на сайте систему комментирвания. При нажатии на конопку &quot;добавить комментарий&quot;, выходит форма с добавлением...

14
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
19.02.2019, 18:09  [ТС]
пример того, что должно получиться (фронт уже есть, нужно только бэк реализовать)
Кликните здесь для просмотра всего текста
0
Эксперт Python
 Аватар для dondublon
4651 / 2071 / 366
Регистрация: 17.03.2012
Сообщений: 10,180
Записей в блоге: 6
22.02.2019, 09:57
Так вы хотите готовый сервис прикрутить или самому написать?
Если самостоятельно, то очевидно, что в Comment у вас должна быть ссылка на parent Comment.
Правда, я не знаю, как такое дерево вытащить одним запросом. (Может, замутить что-то с отдельными полями review id, level вложенности + возможность сортировки.) Гуглить по "древовидные структуры в Django", если ничего не найдёте - "древовидные структуры в SQL".

Добавлено через 2 минуты
А, ну понятно. "двувовидные структуры в Djabgo" ведёт как раз на mptt Это в первую очередь. Во вторую - https://github.com/django-tree... -treebeard . Я бы постарался-таки воспользоваться готовым.
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
22.02.2019, 13:16  [ТС]
dondublon, да, таки реализовал через mptt. Осталось придумать только, как отличать родительские и дочерние комментарии. Скорее всего, вытаскивать с JS parent_id и добавлять...
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
23.02.2019, 20:10
Цитата Сообщение от m0nte-cr1st0 Посмотреть сообщение
dondublon, да, таки реализовал через mptt. Осталось придумать только, как отличать родительские и дочерние комментарии. Скорее всего, вытаскивать с JS parent_id и добавлять...
не углублялся далеко в изучение mptt, но сразу бросились в глаза методы
is_root_node()
is_child_node()
не то?
1
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
24.02.2019, 18:59  [ТС]
Jabbson, спасибо. я это уже по-другому сделал))
Форма добавления древовидных комментариев с mptt
0
 Аватар для IRIP
514 / 146 / 28
Регистрация: 18.04.2015
Сообщений: 1,904
Записей в блоге: 16
25.02.2019, 00:04
https://github.com/lampslave/b... .py#L8-L22 может вот это поможет (дерево строится как-то так )
1
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
25.02.2019, 03:20  [ТС]
IRIP, спасибо.
не могу вытащить никак родителя. Сейчас все комментарии создаются только на верхнем уровне...

HTML5
1
<button class="btn btn-default parent_id" value="{{ node.comment_id }}">Отправить</button>
В консоле JS прилетает нужное значение
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  $(document).ready(function(){
        $('.parent_id').on('click', function(e){
          e.preventDefault()
          parent_id = $(this).val()
          console.log(parent_id)
          //айди комментария
          data = {
            parent_id: parent_id
            }
            $.ajax({
                type: "GET",
                url: '{% url "comments_view" %}',
                data: data,
                        ...
Но во вьюшке почму-то None вытаскивает...
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def comments_view(request):
    comment_form = FeedbackForm(request.POST)
    comments = Feedback.objects.all()
 
    if comment_form.is_valid():
        content = comment_form.cleaned_data.get('content')
        new_comment = Feedback()
        new_comment = Feedback.objects.create(
                        content = content,
                        author = request.user,
                        parent = request.GET.get("parent_id")
    )
        print(new_comment.parent)
        #None
Добавлено через 16 минут
Если попробовать через форму вытаскивать - тоже None
Code
1
comment_id = comment_form.cleaned_data.get('comment_id')
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
25.02.2019, 04:03
а
JavaScript
1
parent_id = $(this).val()
точно вытащит значение value для кнопки?
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
25.02.2019, 13:26  [ТС]
Jabbson,
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
25.02.2019, 14:12
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
25.02.2019, 14:36  [ТС]
Jabbson, странно... и как его вытащить тогда?
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
25.02.2019, 15:03
Цитата Сообщение от m0nte-cr1st0 Посмотреть сообщение
странно
Что именно странно?

Цитата Сообщение от m0nte-cr1st0 Посмотреть сообщение
и как его вытащить тогда?
на том же скрине, ниже
0
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
25.02.2019, 16:26  [ТС]
Jabbson,
HTML5
1
<button class="btn btn-default parent_id1" value="2">Отправить</button>
JavaScript
1
2
3
4
$('.parent_id1').on('click', function(e){
          e.preventDefault()
            parent_id = $('.parent_id1').value
          console.log(parent_id)
0
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
25.02.2019, 17:20
Лучший ответ Сообщение было отмечено m0nte-cr1st0 как решение

Решение

JavaScript
1
2
3
4
5
6
7
8
9
10
11
<script>
    $(document).ready(function () {
        $('.parent_id1').on('click', function (e) {
            e.preventDefault()
            parent_id1 = $(this).val()
            parent_id2 = this.value
            console.log(parent_id1)
            console.log(parent_id2)
        })
    })
</script>
Что, ни один, ни другой вариант не забирает значение?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.02.2019, 17:20
Помогаю со студенческими работами здесь

Php древовидные комментарии
Всем привет. Начал делать комментарии для сайта и столкнулся с проблемой древовидных комментарий. Есть код: do { $date =...

Древовидные комментарии с бесконечной вложенностью
Есть идея написать древовидные комментарии, не знаю на сколько она тупая или хорошая, и как сильно нагрузит сервер, но степень вложенности...

Древовидные комментарии. Кнопка ответить
Не включал никогда этот тип комментариев, но тут просто проверить решил и вот что не нравится. В случае зарегистрированного пользователя...

Нетривиальные древовидные комментарии с вертикальной линией
Сразу скажу, тема создана исключительно с целью &quot;на подумать&quot;, для тех кто нуждается в практике, или же попросту нравиться верстать, а...

XMLGEN И Древовидные запросы
с помощью DBMS_XMLGEN создаю из sql xml А как сделать чтобы xml соотвествовал древовидлной структуре? Так возможно? Вот sql: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru