如何使用Django模板标签或Python处理条件

时间:2017-03-07 23:10:37

标签: python django

你会如何处理?

我需要能够根据我每小时从流量计获得的一些数据设置打开关闭的条件。对python和django来说很新,所以如果这是一个愚蠢的问题,请原谅我。

当仪表超过10英尺时,与仪表相关的区域被认为是关闭的,当它超过8英尺时重新打开。当一个区域关闭时,它必须保持关闭24小时。如果可能的话,我希望能够在Django的模板标签中设置逻辑。每小时(当前条件)将数据填充到读数模型中,并且站是具有要检查的逻辑(洪水阶段)的另一模型。

在我意识到考虑将某个区域关闭的指标更先进之前,这就是我所拥有的。

<td><a href="{% url 'record_detail' pk=item.data.pk %}"><span   
class="status">{% if item.data.stage_feet >= item.flood_stage %}</span>
<span class="alert label">Closed</span>{% else %}<span class="success 
label">Open</span></a></td>{% endif %}

非常感谢任何帮助!!

型号:

class Location(models.Model):
    station_code = models.CharField(max_length=10)
    station_name = models.CharField(max_length=150)
    site_name = models.CharField(max_length=150)
    flood_stage = models.FloatField(null=True, blank=True)
    flood_exit = models.FloatField(null=True, blank=True)

class Measurement(models.Model):
    station = models.CharField(max_length=10)
    stage_feet = models.FloatField(null=True, blank=True)
    flow_kcfs = models.FloatField(null=True, blank=True)
    msl_feet = models.FloatField(null=True, blank=True)
    rain_inches = models.FloatField(null=True, blank=True)
    measurement_time = models.DateTimeField()
    location = models.ForeignKey(Location, on_delete=models.CASCADE)
    geom = gismodels.PointField()
    objects = gismodels.GeoManager()

1 个答案:

答案 0 :(得分:0)

我认为最好的解决方案是在模板标签之外处理,模型上有某种标志。这将为您提供将状态直接绑定到实例的好处,以便您可以在HTML视图的范围之外知道它是open还是close。我的想法是为你的模特做这样的事情。

from django.utils import timezone
from datetime import timedelta

class Location(models.Model):
    ...
    is_closed = models.BooleanField(default=False)
    closed_at = models.DateTimeField(null=True, blank=True)

    def save(self, *args, **kwargs):
        if self.data.stage_feet >= self.flood_stage:
            self.is_closed = True
            if self.closed_at is None:
                self.closed_at = timezone.now()
        elif self.closed_at and self.closed_at > self.reopen_at:
            self.is_closed = False
            self.closed_at = None
        super(Location, self).save(*args, **kwargs) # If using Python 3, this line can be: super().save(*args, **kwargs)

    @property
    is_opened(self):
        return not self.is_closed

    @property
    def reopen_at(self):
        if self.closed_at is None:
            return None
        else:
            return self.closed_at + timedelta(days=1)

我所做的是添加了两个字段。一个是BooleanField作为状态的标志,另一个是DateTimeField来捕捉时间并在24小时后处理开放。

作为旁注,如何将这两个字段合并为一个字段有一个awesome article。我现在不建议这样做,但是肯定值得研究。好主意

因为您说已经有一个过程每小时保存一次数据,所以我认为不需要在模型之外做任何事情。一切都可以通过save()方法处理。

保存实例时,会检查是否已满足触发条件。如果有,则设置is_closed属性并存储datetime

如果没有,则检查时间是否已经过去,并重置标志和条件。

为方便起见,我还添加了一个属性is_opened

我还没有测试过这段代码。