python - 如何检查用户是否订阅了 Django 模板中的产品

标签 python django django-templates subscription

我正在开发一个 Django 项目,我想检查用户是否订阅了产品。我在 models.py 中创建了几个模型实例,但我一直困惑于如何检查用户是否在模板内订阅。这是我的模板,我在其中循环获取的数据:

<ul>
{% for content in content %}
{% if content.model.is_premium and user.is_subscribed %}
       <li>Premium</li>
 {% else %}
  <li>Not premium</li>
  {% endif %}
 {% endfor %}
 </ul>

这是我的观点.py:

@login_required(login_url='/user/login')
def homepage(request):
    content = ModelContent.objects.all()
    categorys = Category.objects.all()
    models = MyModels.objects.all()
    suggestions = MyModels.objects.all()[:3]
    # profiles = Profile.objects.filter(user__is_creator=True)
    context = {"categorys": categorys, "models": models, "content":content, "suggestions":suggestions}
    return render(request, 'users/home.html', context)

这是 models.py:

User = get_user_model()
class MyModels(models.Model):
    owner = models.ForeignKey(Profile, on_delete=models.CASCADE, null=False, blank=False)
    name = models.CharField(max_length=500, null=False, blank=False)
    username = models.CharField(max_length=500, null=False, blank=False, unique=True)
    title = models.CharField(max_length=500, null=False, blank=False)
    description = models.TextField(max_length=500, null=False, blank=False)
    image = models.ImageField(upload_to='img',  blank=True, null=True)
    placeholder = models.ImageField(upload_to='img',  blank=True, null=True)
    sex = models.CharField(max_length=50, choices=SEX_CHOICES, default=NONE)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, null=False, blank=False)
    content_id = models.UUIDField(default=uuid.uuid4, primary_key=True, unique=True, editable=False)
    created = models.DateField(auto_now_add=True)
    is_popular = models.BooleanField(default=False)
    is_premium = models.BooleanField(default=False)
    # posted_content = models.ManyToManyField('ModelContent', related_name='model_content')

    def __str__(self):
        return self.username
class ModelContent(models.Model):
model = models.ForeignKey(MyModels, on_delete=models.CASCADE, null=False, blank=False )
title = models.CharField(max_length=500, null=False, blank=False)
date = models.DateTimeField(auto_now_add=True)
content_id = models.UUIDField(default=uuid.uuid4, primary_key=True, unique=True, editable=False)

class Meta:
    ordering = ['-date']

def __str__(self):
    return str(self.title)

class Subscription(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='subscriptions_to_product')
    model = models.ForeignKey(MyModels, on_delete=models.CASCADE, related_name='subscriptions_from_subscriber')
    is_subscribed = models.BooleanField(default=False)

    def __str__(self):
        return f"{self.user.username} subscribed to {self.model.username}"

views.py 位于名为“users”的应用程序内,而 models.py 位于名为“posts”的应用程序内。 我尝试过这样做:

{% for content in content %}
    {% if content.model.is_premium %}
        {% with subscription=request.user.subscriptions_to_product.filter(model_id=content.model_id).first %}
            {% if subscription and subscription.is_subscribed %}
                <li>User Subscribed</li>
            {% else %}
                <li>User Not Subscribed</li>
            {% endif %}
        {% endwith %}
    {% else %}
        <li>Not premium</li>
    {% endif %}
{% endfor %}

但是没有成功。

最佳答案

不是模板的任务。模板只能用于渲染。不适用于业务逻辑。您可以使用Exists subquery [Django-doc] :

from django.db.models import F
from django.db.models.functions import Exists

@login_required(login_url='/user/login')
def homepage(request):
    content = ModelContent.objects.annotate(
        is_subscriped=Exists(
            Subscription.objects.filter(
                model__modelcontent=OuterRef('pk'),
                user=request.user,
                is_subscribed=True,
            )
        )
    )
    categorys = Category.objects.all()
    suggestions = MyModels.objects.all()[:3]
    context = {
        'categorys': categorys,
        'content': content,
        'suggestions': suggestions,
    }
    return render(request, 'users/home.html', context)

在模板中,您可以将其呈现为:

{% for content in content %}
    {% if content.model.is_premium %}
        {% if <b>content.is_subscribed</b> %}
            <li>User Subscribed</li>
        {% else %}
            <li>User Not Subscribed</li>
        {% endif %}
    {% else %}
        <li>Not premium</li>
    {% endif %}
{% endfor %}

关于python - 如何检查用户是否订阅了 Django 模板中的产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75973048/

相关文章:

python - 运行 GAE 开发服务器时,本地 MySQLdb 连接失败并出现 AttributeError for paramstyle

python - 我收到超时错误 : [WinError 10060] when I parsing my school website

python - 在 Django Admin 的 User 模型中添加 User 相关对象

python - 在 Django 模板中按索引引用列表项?

python - 根据另一列中的日期时间分组并连接多行?

python,创建动态 html 名称值..

django - 统一码编码错误 : 'ascii' codec can't encode character

python - 子模板中的第二个样式表/覆盖样式表

javascript - Django:AJAX请求后加载模板

python - 向每个组 pandas python 添加序列计数