我想在许多不同的Django模板中有一个按钮,鼓励用户订阅两个dj-stripe付费计划中的一个,但我不想向已经订阅任何一个计划的用户显示该按钮
我知道我可以在模板中使用{% if user.is_authenticated %}
。如果用户订阅了dj-stripe计划,我无法找到类似的内容。有什么东西,如果是的话,它是什么?如果没有,我怎么能在没有重复的情况下处理这个问题呢?
答案 0 :(得分:1)
我同意@nnaelle的意见,即在您的用户模型中添加is_subscribed
属性是一个很好的选择,可以确保订阅按钮不会显示给已订阅的用户。添加此属性意味着,如果您尚未添加此属性,则需要在models.py
中extend 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 %}