防止在模板中呼叫敏感方法

當一個物件暴露給模板上下文時,它的無引數方法是可用的。當這些函式是 getters 時,這很有用。但如果這些方法改變某些資料或產生一些副作用,則可能會產生危險。儘管你可能信任模板編寫者,但他可能不會意識到函式的副作用,或者認為錯誤地呼叫了錯誤的屬性。

鑑於以下模型:

class Foobar(models.Model):
    points_credit = models.IntegerField()

    def credit_points(self, nb_points=1):
        """Credit points and return the new points credit value."""
        self.points_credit = F('points_credit') + nb_points
        self.save(update_fields=['points_credit'])
        return self.points_credit

如果你錯誤地在模板中寫這個:

 You have {{ foobar.credit_points }} points!

這將在每次呼叫模板時增加點數。你甚至可能都沒注意到它。

要防止這種情況,你必須將 alters_data 屬性設定為 True 到具有副作用的方法。這將無法從模板中呼叫它們。

def credit_points(self, nb_points=1):
    """Credit points and return the new points credit value."""
    self.points_credit = F('points_credit') + nb_points
    self.save(update_fields=['points_credit'])
    return self.points_credit
credit_points.alters_data = True