首页 > 解决方案 > 无法在 django 中查询特定的“用户订阅”

问题描述

我正在创建一个 django 电子商务网站;该网站“销售”数字商品。我无法获取特定的“用户订阅”,这意味着用户购买了此数字商品,我想在模板中显示它。在这种情况下,我有兴趣在模板中为特定用户显示“plan_name”(来自订阅模型)、“created_date”和“expiry_date”,但不知何故我无法做到。代码如下:

模型.py

class Subscription(models.Model):
    plan_name = models.CharField(max_length=50, null=True, blank=True, verbose_name="Subscription Plan Name")    
    description = models.TextField(verbose_name="Subscription Plan Description")   
    price = models.FloatField(verbose_name="Subscription Plan Price")   
    start_date = models.DateTimeField(auto_now=False, auto_now_add=False, verbose_name="Subscription Plan Start Date")
    end_date = models.DateTimeField(auto_now=False, auto_now_add=False, verbose_name="Subscription Plan End Date")   
    active = models.BooleanField(default=False)         

    class Meta:
        verbose_name = "Subscription"
        verbose_name_plural = "Subscriptions"       

    def __str__(self):
        """Unicode representation of Subscription"""

        return " Subscription type: {}, Description: {}, Price: {}, Is active: {}".format(
                self.plan_name,
                self.description,
                self.price,
                self.active
            )

class UserSubscription(models.Model):
    user = models.ForeignKey(User, related_name= 'tosubscriptions', on_delete=models.CASCADE, null=True, blank=True)
    subscription = models.ForeignKey("Subscription", related_name = 'tosubscriptions',on_delete=models.CASCADE, null=True, blank=True)
    created_date = models.DateTimeField(auto_now_add=True, verbose_name="Created Date")
    expiry_date = models.DateTimeField(auto_now=False, auto_now_add=False, verbose_name="Expiry Date")
    is_canceled = models.BooleanField(default=False, verbose_name="Is Canceled")
    cancel_date = models.DateTimeField(auto_now=False, auto_now_add=False, blank=True, null=True)


    class Meta:
        verbose_name = "User Subscription"
        verbose_name_plural = "User Subscriptions"

    def __str__(self):
        """Unicode representation of UserSubscription"""

        return "PK: [{}] Subscription of: {}, Subscription type: {}, Expiring the: {}".format(
                str(self.pk),
                str(self.user),
                str(self.subscription),
                str(self.expiry_date)
            )

视图.py

class MyProfileView(LoginRequiredMixin, ListView):
    template_name = 'myprofile.html'
    model = UserSubscription

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data()
        context['usersubscription'] = UserSubscription.objects.filter(user=self.request.user)
        return context

模板

{% extends 'base.html' %}

{% block title %}
My Profile
{% endblock %}

{% block content %}
<p>Username: {{user.username}}</p>
<p>First Name: {{user.first_name}}</p>
<p>Last Name: {{user.last_name}}</p>
<p>Birth Date: {{user.userprofile.birth_date}}</p>
<p>Email: {{user.email}}</p>
<p>Language: {{user.userprofile.language}}</p>
<p>Address: {{user.userprofile.address}}</p>
<p>Postal Code: {{user.userprofile.postal_code}}</p>
<p>Country: {{user.userprofile.country}}</p>
<a href="{% url 'updatemyprofile' %}">Update My Profile</a>
<hr>
<p>My Current Plan:{{usersubscription.subscription.plan_name}}</p>
<p>Start Date: {{usersubscription.created_date}}</p>
<p>End Date: {{usersubscription.expiry_date}}</p>
<a href="{% url 'home' %}">Renew my Subscription</a>
<hr>
<p>My Bills:</p>
<p>Bill 1: {{usersubscription.subscription.price}} €&lt;/p>
{% endblock  %}

结果:

用户名:foo

名字:foo

姓名:酒吧

出生日期:2020年2月2日

邮箱:foo@bar.com

语言:EN

地址:富吧大道

邮政编码:1000

国家:美国

更新我的个人资料

我目前的计划:

开始日期:

结束日期:

续订我的订阅

任何帮助,将不胜感激

标签: djangodjango-modelsdjango-viewsdjango-templates

解决方案


你有一个查询集没有一个UserSubscription。尝试

 UserSubscription.objects.filter(user=self.request.user).first()

它只需要第一次订阅,或者更改您如何为您的目的获取特定订阅的逻辑。


推荐阅读