Tworzę witrynę handlu e-commerce Django; Ta strona "sprzedaje" przedmioty cyfrowe. Na jednym z szablonów związanych z "profilem użytkownika", staram się obliczyć pozostałe dni w aplikacji internetowej, ale do tej pory nie udało się tego robić i wyświetlać go na moim szablonie. Próbowałem stworzyć funkcję pozostałych_day, ale w stanie go używać

Później kod:

Models.py

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) 
    # startdate of a subscription, auto_now_add needs to be "False" for acummulation of days in subscriptions
    start_date = models.DateTimeField(auto_now_add=False, null=True, blank=True,verbose_name="Start Date") 
    expiry_date = models.DateTimeField(auto_now=False, auto_now_add=False, null=True, blank=True,verbose_name="Expiry Date") # expiry date of a subscription
    # "is_canceled" is used to calculate if a usersubscription is active
    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: {}, {}, Expiring the: {}, is canceled: {}".format(
                str(self.pk),
                str(self.user),
                str(self.subscription),
                str(self.expiry_date),
                str(self.is_canceled )
            )
    
    def save(self, *args, **kwargs):  # calculated when object is saved and saved in the db
        """
        Function to calculate the expiry date of a user subscription. 
        The expiry_date is saved in the db
        """
        self.expiry_date = self.start_date + timedelta(self.subscription.duration)  # "timedelta" added to be able to calculate automaticaly end dates of subscriptions
        super().save()

    @property
    def is_active(self):
        """
        Function to calculate if a subscription is active 
        This calculation is not stocked in the db
        """
        if not self.is_canceled and datetime.datetime.today() < self.expiry_date:
            return True
        else:
            return False

    @property
    def remaining_days(self):
        remaining = self.expiry_date - self.datetime.datetime.today()
        return remaining

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, null=True, blank=True, verbose_name="Subscription Plan Start Date")
    end_date = models.DateTimeField(auto_now=False, auto_now_add=False, null=True, blank=True, verbose_name="Subscription Plan End Date")   
    is_active = models.BooleanField(default=True)
    duration = models.IntegerField(blank=True, null=True)    

    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.is_active
            )

Views.py

@login_required
def user_profile(request):
    """"""

    all_user_subscription = UserSubscription.objects.filter(user=request.user)
    last_user_subscription = all_user_subscription.last()

    context = {
        "all_user_subscription": all_user_subscription,
        "last_user_subscription": last_user_subscription,
    }

    return render(request, "myprofile.html",context)

Szablon

<p>My Current Plan: {{last_user_subscription.subscription.plan_name}}</p>
<p>End Date: {{last_user_subscription.expiry_date}}</p>
<p>remaining days {{last_user_subscription.remaining}}</p>
<a href="{% url 'home' %}">Renew my Subscription</a>
<hr>
<p>My Bills:</p>
{%for i in all_user_subscription%}
<p>Bill : {{ i.subscription.price }} €</p>
<p>Bought on the : {{ i.start_date }} </p>
{% endfor %}
<hr>

Wynik:

My Current Plan: 1 Month

End Date: April 12, 2021, 11:22 p.m.

remaining days

Renew my Subscription

My Bills:

Bill : 5.0 €

Bought on : March 13, 2021, 10:22 p.m. 
0
zep 14 marzec 2021, 00:38

2 odpowiedzi

Najlepsza odpowiedź

Nie rozumiem dokładnie, jakie jest pytanie. Ale twój "def pozostałych_day":

  1. self.dateTime.datetime.today () Zmiana do dateTime.dateTime.today ()
  2. Po odejmieniu obiektów danych otrzymujesz obiekt Timedelta

Przypuszczam, że może Ci pomóc:

@property
def remaining_days(self):
        remaining = (self.expiry_date - datetime.datetime.today()).days
        return remaining

Zaktualizowany: Próbowałem napisać dane z modeli z wyjątkiem metody save() (nie lubię tego, właśnie go usunęłam), a to (umieściłem to przed meta)

    @property
    def remaining_days(self):
        remaining = (datetime.datetime.now().date() - self.expiry_date.date()).days
        return remaining

I dostałem to (kręciłem losowe daty, expary_date = 2020-10-14)

>>> u=UserSubscription.objects.all().first()
>>> u.remaining_days
151

Myślę, że to ty chcesz

0
koko 14 marzec 2021, 13:51

Spróbuj uruchomić kod z Debugerem w IDE i dodaj punkty przerwania przed zwartościami. Zgadzam się z KOKO tutaj, albo zmienić DatetymeFields w modelach na DATEFIELD (zalecam to, ponieważ nie widzę czasu używać nigdzie) lub przekonwertować datetime do tej pory, a następnie wykonać obliczenia.

0
Neeraj 14 marzec 2021, 06:19