Как в django реализовать подписку на автора в view-функции?

Рейтинг: 0Ответов: 1Опубликовано: 25.03.2023

Есть модель Post

class Post(models.Model):
    text = models.TextField(
        'Текст поста',
        help_text='Введите текст поста',
    )
    pub_date = models.DateTimeField(
        'Дата публикации',
        auto_now_add=True,
    )
    author = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        verbose_name='Автор',
        related_name='posts'
    )
    group = models.ForeignKey(
        Group,
        on_delete=models.SET_NULL,
        blank=True,
        null=True,
        related_name='posts',
        verbose_name='Группа',
        help_text='Выберите группу'
    )
    image = models.ImageField(
        'Картинка',
        upload_to='posts/',
        blank=True,
    )

    def __str__(self) -> str:
        return self.text[:15]

    class Meta:
        ordering = ['-pub_date']
        verbose_name = 'Пост'
        verbose_name_plural = 'Посты'

Есть модель Follow (m2m)

class Follow(models.Model):
    user = models.ForeignKey(
        User,
        related_name='follower',
        on_delete=models.CASCADE
    )
    author = models.ForeignKey(
        User,
        related_name='following',
        on_delete=models.CASCADE
    )

И есть вот такие вьюшки

@login_required
def follow_index(request):
    posts = Post.objects.filter(author__following__user=request.user)
    page_obj = get_page(posts, AMOUNT_POSTS, request)
    context = {
        'page_obj': page_obj,
    }
    return render(request, 'posts/follow.html', context)


@login_required
def profile_follow(request, username):
    # Подписаться на автора
    ...
    return redirect(
        'posts:profile_unfollow',
    )


@login_required
def profile_unfollow(request, username):
    # Отписаться
    ...
    return redirect(
        'posts:profile_follow'
    )

Собственно, как реализовать последние две функции, чтобы реализовывалась подписка на автора поста

Ответы

▲ 0

Решил сделать так:

@login_required
def profile_follow(request, username):
    # Подписаться на автора
    author = get_object_or_404(User, username=username)
    if author != request.user:
        Follow.objects.create(
            user=request.user,
            author=author,
        )
    return redirect(
        'posts:profile',
        author.username
    )


@login_required
def profile_unfollow(request, username):
    # Отписаться
    author = get_object_or_404(User, username=username)
    Follow.objects.filter(
        user=request.user,
        author=author,
    ).delete()
    return redirect(
        'posts:profile',
        author.username
    )