在我的models.py中,我有一个模型类ExchangeRate,其中最常用的是我用来派生一个名为rate的变量。然后我声明了一个函数,它使用这个变量生成相应的GBP到Euro的值。
我的一个视图使用该函数来更新上下文变量。
这很好用,但是当我创建一个应该成为最新版本的ExchangeRate的新实例时,我发现即使我离开感兴趣的网址也存在前一个值的持久性。我只能在停止并重新启动开发服务器时获取要使用的新值。
当我离开然后返回相关的页面/网址,或者每次刷新浏览器时,如何在创建新的ExchangeRate实例的同时更改汇率?
我怀疑这与我需要的会话存储有关(假设这是问题,不想关闭它)。
更多详情如下:
* models.py
class ExchangeRate(models.Model):
value = models.DecimalField(max_digits=5, decimal_places=2)
date = models.DateTimeField(auto_now=True)
def __unicode__(self):
return str(self.value)
我在课堂下面这样分配了它 -
rate = ExchangeRate.objects.latest('date').value
并在以下函数中使用它 -
def euro_total(amount):
return int(rate * amount)
* views.py。
输出用于填充以下SessionWizardView
的上下文class PaymentWizard(SessionWizardView):
def get_context_data(self, form, **kwargs):
context = super(PaymentWizard, self).get_context_data(form=form, **kwargs)
cleaned_data = super(PaymentWizard, self).get_cleaned_data_for_step('amount') or {'method': 'none'}
payment_choice = cleaned_data.get('payment_choice')
if cleaned_data.get('amount'):
amount = int(cleaned_data.get('amount'))
if self.steps.current == 'confirm_amount' or 'bank' or 'card' and not None:
updates =({'input_amount': amount},
{'payment_choice': payment_choice},
{'GBP_total': gbp_total(amount, payment_choice)},
{'EURO_total': euro_total(amount)},
)
for update in updates:
context.update(update)
return context
谢谢大家。
答案 0 :(得分:0)
所以,你的最终评论揭示了这个问题。在首次导入模块时,将在全局级别定义任何内容,并且在重新启动服务器进程之前不会更改。
您需要将该行移动到每次执行的位置:例如,在euro_total
函数内。
或者,如果你担心每次都要点击数据库,你可以使用类似memcache的东西,短暂的超时,并让你的功能在从数据库加载之前先检查缓存。
或者,您可以向ExchangeRate添加一个保存后信号,当一个新值添加到数据库时,它会显式设置全局rate
变量。
答案 1 :(得分:0)
如果rate
需要是全局级别的项目(也许你将它用作缓存值?)那么就像@Daniel所说的那样,你可以使用保存后信号在新的时候自动刷新它保存ExchangeRate对象。
参见django.db.models.signals.post_save 和how to use signals
在Django文档中。