Как сделать лайки django

Добавил пользователь Владимир З.
Обновлено: 04.10.2024

Реализуем систему лайков через GenericForeignKey и пишем для нее API силами Django Rest Framework.

Экспериментальная функция:

Ниже вы видите текст статьи по ссылке. По нему можно быстро понять ссылка достойна прочтения или нет

Просим обратить внимание, что текст по ссылке и здесь может не совпадать.

В статье мы реализуем функционал типичной кнопки “Мне нравится”. В этот функционал входит возможность:

  1. Добавлять лайк;
  2. Удалять свой лайк;
  3. Посмотреть общее количество лайков у объекта;
  4. Проверить, лайкнул ли пользователь объект или нет;
  5. Показать пользователей, которые лайкнули объект.

Первоначальные настройки

Создаем и активируем виртуальное окружение:

Объект, который мы будем лайкать в нашем тестовом проекте будет Твит. Этим объектом может быть все, что угодно: запись из блога, комментарий и т.д. Если вы уже работаете над каким-то своим проектом, то вы сможете легко адаптироваться.

Добавляем приложения в список установленных приложений (INSTALLED_APPS):

Модели (models.py)

Начнем с реализации модели Like:

Модель Like основана на встроенном в Django фреймворке ContentType. Фреймворк ContentType предоставляет отношение GenericForeignKey, которое создает обобщенные (generic) отношения между моделями. Для сравнения, обычный ForeignKey создает отношение только с какой-то конкретной моделью.

Процесс создания GenericForeignKey:

  1. Создаем поле с внешним ключом (ForeignKey) на модель ContentType.
  2. Создаем поле для хранения первичного ключа (primary key) объекта, который вы хотите связать с моделью Like. В этом поле мы будем хранить ID экземпляра модели Tweet. Но хранить можно ID любой модели (моделей), поэтому отношение и называется обобщенным.
  3. Создаем поле типа GenericForeignKey, передав в нее имена полей, которые мы создали в предыдущих двух пунктах.

Создаем модель Tweet и связываем ее с моделью Like через GenericRelation:

После выполнения миграций проверяем работу моделей:

Функционал (services.py)

Реализуем функционал, о котором я говорил в начале статьи (добавление лайка, удаление лайка и т.д). Этот функционал будет представлен в виде обычных функций. Конечного пользователя этих функций (вас или другого программиста) не должно колыхать, как там эти лайки добавляются. Такой пользователь просто хочет вызвать функцию в контроллере (view) или в другом каком-то месте, и получить нужный ему результат.

После реализации (см. ниже) получим функционал:

Что дальше?

Функционал, о котором я говорил в начале урока - готов. Теперь вы можете пойти по одному из путей:

  1. Реализовать приложение используя один Django.
  2. Написать 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

Так как для большинства запросов необходимо быть авторизованным пользователем, то вам нужно создать пользователя (если вы этого еще не сделали):

Create tweet

Лайкаем этот твит:

Like tweet

Проверяем информацию о твите (без авторизации):

Get tweet

Количество лайков (total_likes) увеличилось, а is_fan остался false, потому что запрос сделан без авторизации. Повторим запрос, только с авторизацией:

Система лайков на PHP и Ajax

Наверняка, почти каждый из Вас знает, что такое лайки. Однако, помимо лайков в социальных сетях, можно сделать свою собственную систему лайков на 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.

ты знаеш как добавить код и куда поставить хммммммм

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

enter image description here

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

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, но пока их будет достаточно).

Завершим работу запущенного сервера:

Для начала необходимо поработать с миграциями. Миграции в 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 откроется нужная страница.

Создадим таблицу в базе данных с помощью моделей. Каждая статья будет содержать следующие поля:

  1. Название статьи
  2. Описание статьи (для метатега description)
  3. Ключевые слова (для метатега keywords)
  4. Изображение
  5. Текст статьи
  6. Параметр видимости статьи (для сохранения статьи без её публикации)
  7. Дата изменения
  8. Дата создания

Для отображения нашей модели статьи в админ панели отредактируем файл 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

Для проверки пагинации добавим еще несколько статей.

django пагинация статей

Читайте также: