Как обслуживать премиум-контент на основе подписки пользователя в django

Здравствуйте, ребята, надеюсь, что то, как я задаю этот вопрос, соответствует стандартному способу stackoverflow. У меня есть проект, над которым я работаю. В этом проекте вам нужно подписаться на определенный план (на месяц, 3 месяца или 6 месяцев), чтобы получить доступ к премиум содержанию блога, а если вы не подписаны, но зарегистрированы, вы получите доступ только к обычному содержанию блога. Я смог интегрировать платежный api и оплата работает, я также смог сохранить детали оплаты в таблице в моей базе данных. Теперь мне нужно, как мне отфильтровать пользователей на основе их статуса подписки, чтобы предоставить им премиум или обычные материалы.Ниже приведены мои модели и представления.

Мне нужна помощь в том, как обслуживать премиум-посты на основе пользователей, которые зарегистрированы и подписаны на план, присутствующий в таблице SubscriptionHistory, и обслуживать обычные посты для пользователей, которые не подписаны, но зарегистрированы, Спасибо.

def blog(request):
template_name = 'cms/blog.html'
blogs = Blog.objects.all()
user = request.user
subscribed_user = SubscriptionHistory.objects.filter(user=user, active=True)
featured_story = Blog.objects.filter(featured_stories=True)
latest_new = Blog.objects.filter(latest_news=True)
latest_article = Blog.objects.filter(latest_articles=True)
premium_blogs = Blog.objects.filter(premium=True)
context_regular = {
    'blogs': blogs,
    'featured_story': featured_story,
    'latest_new': latest_new,
    'latest_article': latest_article,
    "premium_blog": premium_blogs
}
context_premium = {
    'blogs': blogs,
    'featured_story': featured_story,
    'latest_new': latest_new,
    'latest_article': latest_article,
    "premium_blog": premium_blogs
}
if subscribed_user:
    return render(request, template_name, context_premium)
else:
    return render(request, template_name, context_regular)

На моем сайте, основанном на подписке, у меня просто есть поле boolean в модели пользователя 'paid', по умолчанию false.

В функции подписки оно устанавливается в true, и я просто ставлю простой оператор if перед любым контентом, который зарезервирован для платных пользователей.

    {% if user.paid %}
        *Paid user content*
    {% else %}
        Please subscribe HERE to see this content
    {% endif %}

Итак, я наконец нашел решение, основанное на примере кода, предоставленного @aina adesina, и кода, и вот что я сделал, что заставило его работать, как ожидалось

def blog(request):
    template_name = 'cms/blog.html'
    blogs = Blog.objects.all()
    user = request.user
    if SubscriptionHistory.objects.filter(user=user, active=True).exists():
        featured_story = Blog.objects.filter(featured_stories=True, premium=True)
        latest_new = Blog.objects.filter(latest_news=True, premium=True)
        latest_article = Blog.objects.filter(latest_articles=True, premium=True)

        context = {
            'blogs':blogs,
            'featured_story':featured_story,
            'latest_new':latest_new,
            'latest_article':latest_article,
        }
        return render(request, template_name, context)
    else:
        featured_story = Blog.objects.filter(featured_stories=True, premium=False)
        latest_new = Blog.objects.filter(latest_news=True, premium=False)
        latest_article =Blog.objects.filter(latest_articles=True, premium=False)
    
        context = {
            'blogs':blogs,
            'featured_story':featured_story,
            'latest_new':latest_new,
            'latest_article':latest_article,
        }
        return render(request, template_name, context)
Вернуться на верх