57059 просмотра
4 ответа
49623 Репутация автора
Я хотел бы прокомментировать это с помощью строки
Ответы (4)
86 плюса
23745 Репутация автора
Автор: Miles Размещён: 06.04.2009 12:04
219 плюса
35808 Репутация автора
В качестве ответа Майлза <% comment %>. <% endcomment %>используется для многострочных комментариев, но вы также можете прокомментировать текст в той же строке, как это:
Автор: Van Gale Размещён: 06.04.2009 12:13
21 плюса
280042 Репутация автора
Используя <# #>обозначения, например:
Автор: mipadi Размещён: 06.04.2009 12:13
2 плюса
446 Репутация автора
В отличие от традиционных html-комментариев :
Комментарии шаблона Django не отображаются в финальном html. Таким образом, вы можете свободно размещать детали реализации там, например:
Взявшись за реализацию комментариев на сайте под Django, я с удивлением обнаружил, что Django не предоставляет никаких модулей для реализации комментариев. Вернее он предоставлял его раньше, это был модуль django.contrib.comments , но в версии 1.7 его объявили как deprecated и предложили либо пилить самостоятельно, либо воспользоваться чем-нибудь вроде Disqus. Хорошо, он вроде тоже поддерживает подсветку синтаксиса кода, но. в статьях одна подсветка, в комментариях другая — это будет некрасиво.
Поэтому будем внедрять собственный велосипед и ловить свои баги.
Для реализации комментариев необходимо:
- Добавить новую модель, назовём её Comment;
- Добавить представление, которое будет обрабатывать добавление комментария;
- Добавить форму для ввода комментария;
- Воспользоваться для организации древовидной структуры подходом Materialized Path ;
Модель Comment
Модель комментариев будет содержать следующие поля:
- path — будет содержать массив целочисленных значений, который будет содержать полный путь к корню. Как было сказано в статье по Materialized Path, это ID всех родительских элементов;
- article_id — внешний ключ на статью, в которой находится комментарий;
- author_id — внешний ключ на автора комментарий;
- content — сам комментарий;
- pub_date — дата и время публикации комментария;
Помимо этого даны методы get_offset() , который будет определять уровень сдвига комментария по длине пути, и get_col() , который будет определять количество колонок в сетке, которые будет занимать комментарий, а также переопределён метод __str__ , который будет отвечать за отображение части содержимого комментария в админке.
Сдвиг и количество колонок будут организовывать древовидное отображение комментариев на странице, но сдвиг будет не более 6 колонок, поскольку на данный момент сетка разбивается на 12 колонок.
Файл urls.py
Комментарий отправляет на сайт с помощью POST запроса по определённому адресу, который необходимо описать в файле urls.py.
Как я уже говорил во многих статьях, я работаю в модуле knowledge со статьями и разделами, но на этот раз я вынес статьи в отдельный модуль, чтобы унифицировать URL статей, чтобы они не зависели от разделов и не терялась индексация в том случае, если статья будет перемещена в другой раздел. Поэтому теперь работа идёт с модулем post . Туда же будет отправлен и комментарий. Отправляться комментарий в итоге будет по пути post/comment/12, если пользователь комментирует статьи с >
Форма комментария
Форма комментария будет помещена в отдельный файл forms.py.
Обработка формы и сохранение комментария будет происходить в представлении, поэтому метода save здесь нет. Данная форма служит лишь для ввода комментария и отсылки его на сервер.
Поле parent_comment очень важное, поскольку оно будет содержать ID родительского комментария, которое будет автоматически подставляться при ответе на один из комментариев под статьёй. Пользователь его заполнять не будет и оно будет скрытым. К тому же его заполнение не является обязательным, поскольку комментарий может относиться непосредственно к статье.
Ну а отношение к определённому комментарию делается с помощью JavaScript скрипта.
Представления
Для добавления комментария я ограничился лишь методом, без всякого представления, тем более, что декоратор @login_required проще прикручивается к методу, чем к представлению.
Также было модифицировано представление отвечающее за отображение статьи, поскольку необходимо было включить форму комментария в контекст отдаваемой страницы статьи, если, конечно, пользователь авторизован.
Шаблон статьи с комментарием
Я уже говорил, что использую модуль django-bootstrap3 для вёрстки страниц? Поэтому не удивляйтесь тому, как свёрстан этот шаблон.
Комментарии представляют собой обычные строки в Grid системе Bootstrap, а древовидность достигается за счёт сдвига колонок.
Очень важным здесь является наличие у каждой строки >
По этому же ID с помощью JavaScript будет перемещаться форма комментария по странице. А помещаться форма будет с помощью функции show_comments_form(). Данная функция помещается в обработчик ссылки «Ответить», у каждого комментария, а также в обработчик ссылки, просто для написания комментария. Данная функция использует библиотеку jQuery. Поэтому не забываем её подключить в вашем базовом шаблоне. У меня подключается та версия, которая используется с Bootstrap.
JavaScript для перемещения комментариев по странице
Ну тут всё просто до безобразия. Если . В противном случае заполняем скрытое поле и помещаем его под комментарием, под которым даём ответ.
Для Django рекомендую VDS-сервера хостера Timeweb .

Рекомендуем хостинг TIMEWEB
Рекомендуемые статьи по этой тематике
Есть комментарий, у него кнопка reply. По нажатию открывается формочка с input для нового коммента и кнопка отправить.
Идея — по нажатию отправить — добавлять к POST запросу аттрибут, который передает родительский комментарий и во вьюхе принимать его и сохранять комментарий с родительским.
Вопрос в том, как в запрос передать название родительского комментария?
- Вопрос задан более года назад
- 171 просмотр


Вадим Шаталов,
Хорошо, делаю так, внутри формы