Django模型方法变量放入模板

Django Model method variable put into template

我有一个模型,我想获取方法变量 "row_count and column" 计数以将值放入模板。

class Data(models.Model):
    """ Model of Data"""
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    document = models.FileField(upload_to='documents/%Y/%m/%d')
    uploaded_at = models.DateTimeField(auto_now_add=True)
    amount = models.DecimalField(default=0, max_digits=6, decimal_places=2,
                                 blank=True, null=True)

    def calculate_amount(self):
        # wb = xlrd.open_workbook('media/' + self.document.name)
        wb = xlrd.open_workbook(os.path.join(settings.MEDIA_ROOT,
                                             self.document.name))
        worksheet = wb.sheet_by_index(0)

        # Show this value into templates
        row_count = worksheet.nrows
        column_count = worksheet.ncols


您可以使用类似于以下代码段的内容,您的模型现在将具有 2 个新属性,row_countcolumns_count,可以在您的模板中调用它们,每个属性都将调用 calculate_amount 来检索它们的值。

我在 calculate_amount 上添加的 if 会阻止多次调用它以避免多次读取文件并可能减慢您的应用程序。

class Data(models.Model):
    """ Model of Data"""
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    document = models.FileField(upload_to='documents/%Y/%m/%d')
    uploaded_at = models.DateTimeField(auto_now_add=True)
    amount = models.DecimalField(default=0, max_digits=6, decimal_places=2,
                                 blank=True, null=True)

    def calculate_amount(self):
        if hasattr(self, '_row_count') or hasattr(self, '_column_count'):
            return
        # wb = xlrd.open_workbook('media/' + self.document.name)
        wb = xlrd.open_workbook(os.path.join(settings.MEDIA_ROOT,
                                             self.document.name))
        worksheet = wb.sheet_by_index(0)

        # Show this value into templates
        self.row_count = worksheet.nrows
        self.column_count = worksheet.ncols

    @property
    def row_count(self):
        self.calculate_amount()
        return self._row_count

    @row_count.setter
    def row_count(self, value):
        self._row_count = value

    @property
    def column_count(self):
        self.calculate_amount()
        return self._column_count

    @column_count.setter
    def column_count(self, value):
        self._column_count = value

更新为 property setters