我正在开发一个 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/