检查用户是否在Django模板中使用dj-stripe订阅

时间:2015-05-25 20:39:43

标签: python django stripe-payments

我想在许多不同的Django模板中有一个按钮,鼓励用户订阅两个dj-stripe付费计划中的一个,但我不想向已经订阅任何一个计划的用户显示该按钮

我知道我可以在模板中使用{% if user.is_authenticated %}。如果用户订阅了dj-stripe计划,我无法找到类似的内容。有什么东西,如果是的话,它是什么?如果没有,我怎么能在没有重复的情况下处理这个问题呢?

2 个答案:

答案 0 :(得分:1)

我同意@nnaelle的意见,即在您的用户模型中添加is_subscribed属性是一个很好的选择,可以确保订阅按钮不会显示给已订阅的用户。添加此属性意味着,如果您尚未添加此属性,则需要在models.pyextend the user model跟踪他们是否已订阅。这看起来像这样(在Django文档中):

from django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    is_subscribed = models.BooleanField(default=False)

然后可以通过views.py中的视图访问新用户模型:

from my_app.models import UserProfile

def index(request):
    user = request.user
    userprofile = UserProfile.objects.get(user=user)
    ...

您可以(并且可能希望)避免以这种方式访问​​用户个人资料,但是,如settings.py文档中所述,将新用户模型设置为{% if not userprofile.is_subscribed %}下应用的默认设置}。然后,在将新用户模型传递到视图后,您可以使用{% if not userprofile.is_subscribed %} <div ...></div> {% endif %} 检查订阅状态,并仅显示未订阅的订阅按钮:

#include <type_traits>
class low {};
class high {};
template <int N, class T>
   void func(T, low)
   {
      // version for high N
   }
template <int N, class T>
   void func(T, high)
   {
      // version for low N
   }
template <int N, class T>
   void func(T val)
   {
      func<N>(val, std::conditional_t<(N>=100), high, low>{});
   }
int main()
{
   func<3>(3.14159); // low version
   func<256>("Yo"); // high version
}

随时向我提供反馈意见!

答案 1 :(得分:1)

事实证明已经有a dj-stripe solution to this(我在Google搜索中找不到)。

我刚刚将其添加到我的扩展用户模型中:

def __str__(self):
    return self.username

def __unicode__(self):
    return self.username

@cached_property
    def has_active_subscription(self):
        """Checks if a user has an active subscription."""
        return subscriber_has_active_subscription(self)

然后将其添加到我的模板中:

{% if request.user.has_active_subscription %}
    <a href="/payments/history/">Subscription History</a>
{% else %} 
    <a href="/payments/subscribe/">Upgrade to Premium Content!</a>
{% endif %}