Как сделать лайки django
Реализуем систему лайков через GenericForeignKey и пишем для нее API силами Django Rest Framework.
Экспериментальная функция:
Ниже вы видите текст статьи по ссылке. По нему можно быстро понять ссылка достойна прочтения или нет
Просим обратить внимание, что текст по ссылке и здесь может не совпадать.
В статье мы реализуем функционал типичной кнопки “Мне нравится”. В этот функционал входит возможность:
- Добавлять лайк;
- Удалять свой лайк;
- Посмотреть общее количество лайков у объекта;
- Проверить, лайкнул ли пользователь объект или нет;
- Показать пользователей, которые лайкнули объект.
Первоначальные настройки
Создаем и активируем виртуальное окружение:
Объект, который мы будем лайкать в нашем тестовом проекте будет Твит. Этим объектом может быть все, что угодно: запись из блога, комментарий и т.д. Если вы уже работаете над каким-то своим проектом, то вы сможете легко адаптироваться.
Добавляем приложения в список установленных приложений (INSTALLED_APPS):
Модели (models.py)
Начнем с реализации модели Like:
Модель Like основана на встроенном в Django фреймворке ContentType. Фреймворк ContentType предоставляет отношение GenericForeignKey, которое создает обобщенные (generic) отношения между моделями. Для сравнения, обычный ForeignKey создает отношение только с какой-то конкретной моделью.
Процесс создания GenericForeignKey:
- Создаем поле с внешним ключом (ForeignKey) на модель ContentType.
- Создаем поле для хранения первичного ключа (primary key) объекта, который вы хотите связать с моделью Like. В этом поле мы будем хранить ID экземпляра модели Tweet. Но хранить можно ID любой модели (моделей), поэтому отношение и называется обобщенным.
- Создаем поле типа GenericForeignKey, передав в нее имена полей, которые мы создали в предыдущих двух пунктах.
Создаем модель Tweet и связываем ее с моделью Like через GenericRelation:
После выполнения миграций проверяем работу моделей:
Функционал (services.py)
Реализуем функционал, о котором я говорил в начале статьи (добавление лайка, удаление лайка и т.д). Этот функционал будет представлен в виде обычных функций. Конечного пользователя этих функций (вас или другого программиста) не должно колыхать, как там эти лайки добавляются. Такой пользователь просто хочет вызвать функцию в контроллере (view) или в другом каком-то месте, и получить нужный ему результат.
После реализации (см. ниже) получим функционал:
Что дальше?
Функционал, о котором я говорил в начале урока - готов. Теперь вы можете пойти по одному из путей:
- Реализовать приложение используя один Django.
- Написать API (Django Rest Framework, Django Tastypie, …) и затем обработать его (React, Vue.js, Elm, …)
Сегодня модно использовать Javascript на фронте, поэтому я пойду по второму пути и напишу API с помощью Django Rest Framework (frontend за вами).
Пишем API
Устанавливаем django rest framework:
Обновляем список установленных приложений:
Создаем ViewSet используя ModelViewSet, который снабжает нас create, update, list, retrieve, delete методами:
Так как мы используем ViewSet, то нам нет необходимости самим настраивать URLs. Можно использовать готовый класс Router, который предоставляет django rest framework:
Теперь эти urls нужно включить в django_likes/urls.py:
На данный момет нам доступны только стандартные CRUD операции над моделью Tweet.
Для реализации оставшегося API создадим viewset mixin используя декоратор detail_route:
Последний штрих. Наследуемся от миксина:
Тестим API
Так как для большинства запросов необходимо быть авторизованным пользователем, то вам нужно создать пользователя (если вы этого еще не сделали):
Лайкаем этот твит:
Проверяем информацию о твите (без авторизации):
Количество лайков (total_likes) увеличилось, а is_fan остался false, потому что запрос сделан без авторизации. Повторим запрос, только с авторизацией:
Наверняка, почти каждый из Вас знает, что такое лайки. Однако, помимо лайков в социальных сетях, можно сделать свою собственную систему лайков на PHP и Ajax. В этой статье мы это подробно разберём.
Безусловно, на практике настоятельно рекомендую хранить лайки в базе данных. Однако, в рамках данной статьи, чтобы код легко было проверить, я решил сделать хранение лайков в ini-файле. Итак, вот собственно файл likes.ini:
Формат следующий: "id_статьи=количество_лайков". Теперь займёмся подготовкой данных для вывода на страницу:
Код прокомментирован, поэтому проблем с его пониманием возникнуть не должно. Теперь приступим к HTML-коду:
Здесь мы просто выводим данные на страницу. Самому блоку можно задать, безусловно, различные стили (например, хотя бы cursor: pointer;) для красоты.
И, наконец, пришло время написать скрипт like.php, который и занимается увеличением числа лайков:
Также обратите внимание, что в данном скрипте при попытке добавить лайк к статье, которой нет в INI-файле, ничего не выйдет. Эта проблема решается добавлением новой строки в INI-файл, если в процессе цикла так и не было обнаружено искомой статьи. Но, учитывая, что всё равно лайки надо хранить в базе данных, я убрал эту дополнительную функциональность из кода.
Вот таким образом делается система лайков на PHP и Ajax.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Она выглядит вот так:
Комментарии ( 5 ):
какой у вас плагин для подсветки кода?
Насколько я понял по коду страниц, плагин этот: https://code.google.com/p/google-code-prettify/ Что же касается самой статьи, нужно понимать, что отдельно взятый "лайк" на практике соответствует не только статье, но и конкретному пользователю. Поэтому для реализации с БД логично было бы сделать отдельную таблицу с лайками, которая будет иметь поля с id лайка, id связанной статьи и id связанного пользователя. На мой взгляд проблема состоит именно в этом, чтобы правильно организовать связи, а отправка ajax - это уже дело техники. И если уж совсем "разложить по косточкам" - получать данные в json было бы даже несколько удобнее.
а после отправки запроса на like.php какой переменной будет обозначаться id статьи?
Хорошая статья Михаил, но, как мне кажется, пора уже отказываться полностью от шорт тегов в PHP.
ты знаеш как добавить код и куда поставить хммммммм
Я пытаюсь создать страницу, где люди могут видеть самую высокорейтинговую статью, но есть одна проблема: когда я фильтрую количество лайков статьи, которая также понравилась другому пользователю, она создает копию статьи с повышенным рейтингом.
Я хочу, чтобы статьи в блоге были упорядочены по наибольшему количеству лайков.
models.py
views.py
article_ordered_by_likes.html
Почему Django создает один и тот же пост несколько раз? Как я могу заказать статьи по наибольшему количеству лайков, не имея этой проблемы?
2 ответа
У меня есть массив, который выглядит примерно так, $users = array( 0 => array( 'user_id' => 'user_1', 'likes' => 50, ), 1 => array( 'user_id' => 'user_2', 'likes' => 72 ), 2 => array( 'user_id' => 'user_3', 'likes' => 678 ) ); Все, что я хочу сделать, это внедрить.
Вам нужно будет использовать annotate . Вот как вы можете упорядочить по количеству пользователей, которые "liked" статью:
Похожие вопросы:
Думаю, у меня есть довольно простой вопрос.. У меня есть поле базы данных, в котором хранится размер файлов в байтах. Я хочу сделать заказ по самому большому размеру файла, но он работает не так.
У меня есть модель под названием websites that has_many :likes , и, конечно же, еще одна модель под названием likes with belongs_to :website . Я хочу получить массив всех сайтов, но упорядочить их.
У меня есть форум, и я хотел бы найти самых популярных пользователей. Самые популярные пользователи определяются по наибольшему количеству лайков на постах и комментариях, а также по наибольшему.
Как я могу агрегировать результаты по наибольшему количеству с помощью aggregation framework? < type: dog, name: buddy, count: 67 >, < type: dog, name: buddy, count: 34 >, < type: dog, name: tucker.
У меня есть массив, который выглядит примерно так, $users = array( 0 => array( 'user_id' => 'user_1', 'likes' => 50, ), 1 => array( 'user_id' => 'user_2', 'likes' => 72 ), 2 =>.
Я создал функцию поиска в своем проекте, используя запрос mysqli LIKE. Мое последнее препятствие-это ORDER , в котором он выводится. Текущий Сценарий: if(isset($_GET['userInput'])) < $search =.
Я хочу перебрать все ответы пользователя и упорядочить их по количеству лайков, которые получил ответ, но я не могу понять, как это сделать, @user.answers.likes не работает, я нашел способ найти все.
Я пытаюсь сортировать посты по количеству лайков, используя expressjs и mongodb. get postsByLikes/:category, (req, res, next) -> category = req.params.category db.posts.aggregate([
Я экспериментирую с YouTube-ми API-ми и пытаюсь понять, как вернуть упорядоченный список видео по наибольшему количеству лайков. Я знаю, что могу получить доступ к количеству лайков с помощью.
Я работаю над проектом, который должен получить пользовательский ввод, поместить его в список, передать этот список нескольким функциям для манипулирования, а затем вернуть данные в виде новых.
Я расскажу о там, как создать простой блог на фреймворке Django. Статья будет полезна новичкам в сфере Веб-программирования для того, чтобы разобраться в принципе работы и сути django. И так, поехали!
Проект написан с использованием:
Python 3.6.3 — высокоуровневый язык программирования.
Django 2.0.2 — фреймворк для веб-приложений.
Visual Code — текстовый редактор c поддержкой плагинов
Установка Python
Для выхода пропишите exit().
Установка Django
Django установим с помощью менеджера пакетов Python — pip:
Создание проекта
Ненадолго отложим редактор и запустим стандартный проект django (при выполнении команд с обращением к файлу manage.py, например, запуск сервера вы должны находится в непосредственно в папке с этим файлом. В данном случае это D:\djangoProject\myBlog)
Ура! Все работает. Теперь создадим аккаунт администратора, с помощью которого вы сможете добавлять, редактировать и удалять статьи (это конечно не все возможности админки django, но пока их будет достаточно).
Завершим работу запущенного сервера:
Для начала необходимо поработать с миграциями. Миграции в django используются для переноса изменений в моделях на структуру базы данных. Модели в свою очередь отражают данные в виде полей в таблице базы данных. В нашем случае в базу данных необходимо занести таблицы для хранения данных админа.
Нам будет предложено ввести логин, e-mail почту и пароль.
Логин для удобства введем admin, почту можно не вводить и пароль (мин. 8 символов). Будьте внимательны, вводимые символы пароля в консоли никак не отображаются (в целях безопасности).
Попробуем залогиниться в админ панели. Для этого запустим сервер:
В итоге откроется админ панель:
Все работает, стартовый проект создан и создан аккаунт администратора. Сейчас перейдем к созданию Веб-приложения в django. В нашем случае Веб-приложение — это блог, который имеет свой собственный функционал (вывод всех статей и вывод отдельной).
Для этого завершим работу сервера (Ctrl + C) и пропишем следующую команду:
Поработаем с обработкой url-запросов. Нам необходимо, чтобы при запросе 127.0.0.1:8000 открывалась главная страница со списком всех статей.
Отредактируем файл djangoProject/myBlog/myBlog/urls.py следующим образом:
И редактируем в файле djangoProject/myBlog/myBlog/settings.py настройку TEMPLATES:
В созданной папке templates создаем файл base.html:
Это базовый шаблон, который будет дополнятся другими.
Создадим в папке djangoProject/myBlog/templates новую папку partial, в которой и будут находится .html файлы, расширяющие базовый.
В папке partial создадим файл home.html:
При обращении к файлу home.html содержимое блоков head и body в файле base.html заменится содержимым файла home.html. такая система организации шаблонов добавляет динамику и в разы упрощает работу.
Теперь запустив сервер откроется не стандартная страница django, а наш файл base.html, расширенный файлом partial/home.html
Точно таким же способом добавим страницу для просмотра отдельной статьи, которую назовем partial/single.html:
Отредактируем файл djangoProject/myBlog/blog/urls.py, где — указывает, что на этом месте может располагаться число, которое будет считываться в файле djangoProject/myBlog/blog/views в функции single. Это число будет использоваться как номер определенной статьи.
В файле djangoProject/myBlog/blog/views.py добавим новую функцию для вывода отдельной статьи
Создаем шаблон для вывода отдельной статьи djangoProject/myBlog/templates/partial/single.html
Теперь после запуска сервера и переходе по ссылке 127.0.0.1:8000/323 откроется нужная страница.
Создадим таблицу в базе данных с помощью моделей. Каждая статья будет содержать следующие поля:
- Название статьи
- Описание статьи (для метатега description)
- Ключевые слова (для метатега keywords)
- Изображение
- Текст статьи
- Параметр видимости статьи (для сохранения статьи без её публикации)
- Дата изменения
- Дата создания
Для отображения нашей модели статьи в админ панели отредактируем файл djangoProject\myBlog\blog\admin.py, где list_display — поля, отображающиеся в списке статей; list_display_links — поля, являющиеся ссылками для подробного просмотра полей статьи; list_editable — поля, доступные для редактирования сразу из просмотра списка всех статей; list_filter — фильтры в правой части страницы; search_fields — поля по которым осуществляется поиск.
Укажем папку для сохранения загружаемых изображений (поле image) и паку для хранения статических файлов (например, css файлы, js срипты). Для этого добавим в конце файла djangoProject\myBlog\settings.py следующие 3 строчки
И создадим эти папки со следующим расположением: djangoProject/media и djangoProject/static
Помимо сохранения изображений через админ панель необходимо корректно их загружать в шаблон. Для этого отредактируем файл djangoProject\myBlog\views.py
Заходим в админ панель — 127.0.0.1:8000/admin > переходим в Posts > add Post (в верхнем правом углу). Заполняем текстовые поля, загружаем изображение и оставляем галочку напротив visible (т.е. не скрывать статью). Нажимаем SAVE. Статья добавлена, изображение сохранилось в папку djangoProject/media
Настало время для вывода статей в шаблон home, т.е. на главную страницу.
Изменяем файл djangoProject/myBlog/blog/views.py. Подключаем модули для работы с пагинацией (постраничный вывод новостей) и модель Post. В функции home получаем все записи из таблицы Post и делим их по 4 на каждую страницу. Словарь context содержит ключи и значения, которые будут далее выводиться в шаблон.
С помощью тега truncatechars, обрежем строку до 70 первых символов.
В базовый шаблон djangoProject\myBlog\templates\base.html добавим css файл, который следует создать с расположением djangoProject\static\css\style.css
Для проверки пагинации добавим еще несколько статей.
Читайте также: