Как реализовать в Django историю посещённых постов?

Для реализации истории посещенных постов в Django, вы можете использовать несколько подходов. Здесь был выбран один из возможных вариантов реализации.

1. Создание модели истории:
Вам необходимо создать модель, которая будет представлять историю посещенных постов. Создайте новый файл models.py в вашем приложении Django и определите модель, которая будет иметь следующие поля:

   from django.db import models
   from django.contrib.auth.models import User
   from django.utils import timezone

   class Post(models.Model):
       title = models.CharField(max_length=200)
       content = models.TextField()

   class VisitedPost(models.Model):
       user = models.ForeignKey(User, on_delete=models.CASCADE)
       post = models.ForeignKey(Post, on_delete=models.CASCADE)
       timestamp = models.DateTimeField(default=timezone.now)

В этой модели у нас есть поле user, которое ссылается на модель пользователя User, поле post, которое ссылается на модель поста Post, а также поле timestamp, которое будет хранить время, когда пост был посещен.

2. Создание представления для сохранения истории:
Вам необходимо создать представление, которое будет сохранять информацию о посещенных постах в истории. Создайте новый файл views.py в вашем приложении Django и определите представление следующим образом:

   from django.shortcuts import get_object_or_404
   from .models import VisitedPost, Post

   def save_visited_post(request, post_id):
       post = get_object_or_404(Post, id=post_id)
       visited_post, created = VisitedPost.objects.get_or_create(user=request.user, post=post)
       # обновляем timestamp
       visited_post.timestamp = timezone.now()
       visited_post.save()

В этом представлении мы получаем объект поста по его идентификатору, а затем создаем объект VisitedPost с текущим пользователем и найденным постом. Если объект уже существует, мы обновляем поле timestamp и сохраняем его.

3. Использование представления в шаблоне:
Теперь, чтобы сохранить пост в историю, вам нужно вызвать представление save_visited_post в соответствующем шаблоне.
В шаблоне, где отображается пост, можно сделать ссылку следующим образом:

   <a href="{% url 'save_visited_post' post.id %}">Сохранить в истории</a>

Помните, что вы должны настроить маршрутизацию для этого представления в вашем urls.py.

4. Отображение истории посещенных постов:
Для отображения истории посещенных постов вы можете создать отдельное представление и шаблон. В представлении вы можете получить все записи VisitedPost для текущего пользователя и передать их в шаблон. Вы можете отсортировать записи по полю timestamp, чтобы отобразить их в порядке последнего посещения.

   from .models import VisitedPost

   def visited_posts(request):
       visited_posts = VisitedPost.objects.filter(user=request.user).order_by('-timestamp')
       return render(request, 'visited_posts.html', {'visited_posts': visited_posts})

Шаблон visited_posts.html может выглядеть следующим образом:

   <h1>История посещенных постов:</h1>
   <ul>
   {% for visited_post in visited_posts %}
       <li>{{ visited_post.post.title }} - {{ visited_post.timestamp }}</li>
   {% endfor %}
   </ul>

В этом шаблоне мы просто перебираем посты в истории и выводим их заголовок и метку времени.

Это краткое объяснение, как реализовать историю посещенных постов в Django. Обратите внимание, что вам также понадобится настраивать аутентификацию пользователей и обрабатывать ситуации, когда пользователь не аутентифицирован.