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

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

19.02.2019, 18:02. Показов 4570. Ответов 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
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru