Как обслуживать премиум-контент на основе подписки пользователя в 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)