【发布时间】:2022-01-11 21:37:06
【问题描述】:
大家好,我希望我提出这个问题的方式符合 stackoverflow 的标准方式。 我有一个我正在做的项目。在这个项目上,您需要订阅一个计划(每月、3 个月或 6 个月)才能访问高级博客文章内容,如果您没有订阅但已注册,您将只能访问常规博客文章内容。我已经能够集成支付 api 并且支付正在工作,我还能够将支付详细信息保存在我的数据库中的表格中。我现在需要的是如何根据订阅状态过滤用户,为他们提供优质或常规内容。下面是我的模型和视图。
# In models.py
class User(AbstractBaseUser, PermissionsMixin):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True)
username = models.CharField(max_length=200, unique=True, blank=True)
email = models.EmailField(max_length=200, unique=True, blank=False)
first_name = models.CharField(max_length=200, blank=True)
last_name = models.CharField(max_length=200, blank=True)
phone_no = models.CharField(max_length=11,validators=[MaxLengthValidator(11)])
profile_picture = models.ImageField(upload_to="images/profile_image",default="default_user_image.jpeg", blank=True, null=True)
is_active = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
date_joined = models.DateTimeField(auto_now_add=True)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
objects = UserManager()
EMAIL_FIELD = 'email'
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email',]
def __str__(self):
return self.username
def get_absolute_url(self):
return reverse("admin-update-user", kwargs={"pk": self.pk})
class Blog(models.Model):
title = models.CharField(max_length=200)
slug = models.SlugField(blank=False, null=False)
author = models.ForeignKey(User, on_delete=models.CASCADE, default=True)
post = RichTextUploadingField()
featured_stories = models.BooleanField(default=False)
latest_news = models.BooleanField(default=False)
latest_articles = models.BooleanField(default=False)
featured_image = models.ImageField(null=True, blank=True, default="default.png", upload_to="blog_images/")
premium = models.BooleanField(default=False)
id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)
def __str__(self):
return self.title
def snippet(self):
return self.post[:150]
def get_absolute_url(self):
return reverse("blog-detail", kwargs={"pk": self.pk})
#subscription plan for premium blog views
class Plan(models.Model):
title = models.CharField(max_length=100)
slug = models.SlugField(unique=True)
desc = models.TextField()
price = models.IntegerField(default=0)
discount_price = models.IntegerField(default=0)
discount= models.IntegerField(default=0)
created_on = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ("created_on",)
def __str__(self):
return self.title
# this saves the subscription record which will be used to filter premium blog from the blog model and assoicate it to users
class SubscriptionHistory(models.Model):
id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)
user = models.ForeignKey(User, on_delete=models.CASCADE)
email = models.EmailField(max_length=200, unique=True, blank=False)
full_name = models.CharField(max_length=200, blank=False)
phone_no = models.CharField(max_length=11, unique=True, blank=False)
plan = models.ForeignKey(Plan, on_delete=models.CASCADE, default='monthly plan')
amount_paid = models.IntegerField(default=0)
reference = models.CharField(max_length=200, unique=True, blank=False)
transaction_id = models.CharField(max_length=200)
status = models.CharField(max_length=200)
start_date = models.DateTimeField(auto_now_add=True)
expiry_date = models.DateTimeField(auto_now=True)
active = models.BooleanField(default=False)
def __str__(self):
return self.user.username
# in views.py
# blog list
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 = {
'blogs':blogs,
'featured_story':featured_story,
'latest_new':latest_new,
'latest_article':latest_article,
"premium_blog":premium_blogs
}
return render(request, template_name, context)
所以我需要帮助的是如何根据已注册并订阅计划的用户提供高级帖子,显示在 SubscriptionHistory 表中,并仅向未订阅但已注册的用户提供常规帖子,谢谢。
【问题讨论】: