【问题标题】:How to serve premium content base on user subscription in django如何在 django 中根据用户订阅提供优质内容
【发布时间】: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 表中,并仅向未订阅但已注册的用户提供常规帖子,谢谢。

【问题讨论】:

    标签: python html django


    【解决方案1】:

    所以我终于根据@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)
    

    【讨论】:

      【解决方案2】:

      在我基于订阅的网站上,我的用户模型“付费”中只有一个布尔字段,默认值为 false。

      在订阅功能中,它被设置为 true,我只是在为付费用户保留的任何内容之前放置一个简单的 if 语句。

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

      【讨论】:

      • 是的,我已经在 SubscriptionHistory 模型上添加了一个布尔字段“活动”,这是我后来使用的,一切正常。我在视图而不是模板上做了 if 语句逻辑。谢谢你的贡献。
      【解决方案3】:
      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)
      

      【讨论】:

      • 有很多方法可以解决这个问题,这只是一个非常简单/漫长的方法。如果您仍有任何问题,请尝试告诉我。
      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      • 感谢您提供的分析器。它让我意识到我的最终解决方案如下
      猜你喜欢
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 2014-08-19
      • 1970-01-01
      • 2015-11-27
      • 2020-09-09
      相关资源
      最近更新 更多