创建一个简单的 python 计算以在特定对象记录的管理面板中显示
Posted
技术标签:
【中文标题】创建一个简单的 python 计算以在特定对象记录的管理面板中显示【英文标题】:Creating a simple python calculation to show in the admin panel on a specific object record 【发布时间】:2019-11-09 01:36:29 【问题描述】:我是 python 的新手,正在开发一个新的 django 项目,并希望使用记录数据在管理面板中显示特定记录的计算。这也将在用户界面上复制(尚未构建)。
我已经学习了变量的基本存储和操作,以用于根据基本用户输入进行的其他计算。这有点不同,因为它是在管理面板中完成的。我正在使用 PyCharm,但 PyCharm 告诉我有错误。我还使用此处的链接来查看是否可以使其正常工作:
https://www.reddit.com/r/django/comments/6xigr3/how_to_show_calculated_field_in_django_admin/
我意识到下面的代码不正确,但我也不确定我是否正确引用了变量以从主函数中访问它们?
在管理面板与用户界面中使用时,定义此功能有何变化?
感谢您对上述任何问题的任何帮助!
# Create a class to calculate the volume by first converting inches to ft, then to cubic yd
class Volume(models.Model):
linear_ft = models.DecimalField('Length in feet: ', max_digits=200, decimal_places=2)
depth_in = models.DecimalField('Depth in inches: ', max_digits=200, decimal_places=2)
width_in = models.DecimalField('Width in inches: ', max_digits=200, decimal_places=2)
# Convert inches to feet, store variables for use in future functions
def in_to_ft(self):
depth_ft = self.depth_in * 12
width_ft = self.width_in * 12
# Call to get cubic yards which uses variables from previous functions
def get_cu_yd(self):
dims = str(self.linear_ft) + " length x " + str(self.depth_ft) + " depth x " + str(self.width_ft) + " width")
cubic_ft = self.linear_ft * self.depth_ft * self.width_ft
cubic_yd = cubic_ft * 0.037037
return cubic_yd + "cubic yards: " + str(self.dims)
# Register the function to the property method
obj_cu_yd = property(get_cu_yd)
def __str__(self):
return obj_cu_yd
我想接受用户输入(可能是小数),将英寸转换为英尺,通过乘以长度 (ft) x 宽度 (ft) x 深度 (ft) 来计算立方英尺并存储一个 'string ' 版本以显示对象的尺寸。 str(self) 应该返回立方码和描述对象尺寸的字符串。
::更新:: 我已经走到这一步了:
# Create a class to calculate the volume by first converting inches to ft, then to cubic yd
类卷(models.Model): 名称 = models.CharField(max_length=200) linear_ft = models.DecimalField('长度以英尺为单位:', max_digits=200, decimal_places=2, default=0) depth_in = models.DecimalField('以英寸为单位的深度:', max_digits=200, decimal_places=2, default=0) width_in = models.DecimalField('宽度英寸:', max_digits=200, decimal_places=2, default=0)
# Create empty variables so not to divide/multiply by nonzero
cubic_ft = 0
cubic_yd = 0
# Set conversion rate from ft to yards
cubic_ft_yd = 0.037037
# Call to get cubic yards
def get_cu_yd(self):
depth_ft = decimal.Decimal(self.depth_in) * 12
width_ft = decimal.Decimal(self.width_in) * 12
dims = str(self.linear_ft) + " length x " + str(depth_ft) + " depth x " + str(width_ft) + " width"
cubic_ft = decimal.Decimal(self.linear_ft)*depth_ft*width_ft
cubic_yd = cubic_ft*self.cubic_ft_yd
return str(self.name) + " - " + str(cubic_yd) + "cubic yards: " + dims
# Register the function to the property method
obj_cu_yd = property(get_cu_yd)
def str(自我): 返回 obj_cu_yd
现在我的问题是这个错误: 不支持的操作数类型:“decimal.Decimal”和“float” 参考cubic_yd =cubic_ftself.cubic_ft_yd
提前致谢
【问题讨论】:
【参考方案1】:您不应该这样设置depth_ft
和width_ft
。您需要改为设置self.depth_ft = self.depth_in * 12
,以便变量实际注册为实例的成员。
事实上,你根本不应该有那个辅助函数。
def get_cu_yd(self):
depth_ft = self.depth_in * 12
width_ft = self.width_in * 12
dims = str(self.linear_ft) + " length x " + str(depth_ft) + " depth x " + str(width_ft) + " width")
cubic_ft = self.linear_ft * depth_ft * width_ft
cubic_yd = cubic_ft * 0.037037
return dims + "cubic yards: " + str(self.dims)
【讨论】:
当我这样做时,我得到一个错误:TypeError at /admin/formulas/volume/add/ unsupported operand type(s) for *: 'NoneType' and 'int'。我认为这与创建实例之前没有值的 Volume 变量有关吗?例如,是否需要在记录第一条记录之前放置一个空值。 IE。有一个空列表或其他什么? @AlexanderDing 你最后的评论不正确,self.linear_ft
会给你价值。
@KevinW 你应该给你的字段default=0
属性。
谢谢@DanielRoseman -- 我必须添加 import decimal,然后添加 decimal.Decimal(self.depth) * 12 (例如,在这一行),我必须在其他人身上这样做清除错误。现在我在cubic_yd变量上有它并且得到一个错误:不支持的操作数类型*:'decimal.Decimal'和'float'以上是关于创建一个简单的 python 计算以在特定对象记录的管理面板中显示的主要内容,如果未能解决你的问题,请参考以下文章