我试图在表单提交后更新另一个模型的对象。我希望Savings
模型中已存在的单个对象已更新,以反映最近的Entry
提交。
流程:
填写并提交Entry
表单后,我需要Savings
对象,其中包含" total"字段,待更新。
Savings
字段从Entry
表单中获取数据,对其求和,然后将其发布到相应的字段。例如,Savings.total_spent_euros
汇总Entry.euros_sums
和Savings.total_spent_dollars
汇总Entry.dollars_sum
。这个逻辑不是问题。我遇到的问题是我现在必须在Savings
中打开admin
对象,并在每次希望对象包含最新条目时保存它。我想自动化。
models.py
class Entry(models.Model):
date = models.DateField(blank=True, null=True,)
euros = models.CharField(max_length=500, blank=True, null=True)
comments = models.CharField(max_length=900, blank=True, null=True)
euros_sum = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
xrate = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
dollars_sum = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
daily_savings_dollars = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
daily_savings_display = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
def get_absolute_url(self):
return reverse('argent:detail', kwargs={'pk': self.pk})
class Savings(models.Model):
total_spent_euros = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
total_spent_dollars = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
total_savings = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
total_savings_display = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
我是否正确地假设我的命令必须在这两个视图中输入? (我可能错了):
views.py
class EntryCreate(CreateView):
form_class = EntryForm
template_name = 'argent/entry_form.html'
def form_valid(self, form):
Savings.objects.update(id=1)
return super(EntryCreate, self).form_valid(form)
class EntryUpdate(UpdateView):
model = Entry
form_class = EntryForm
template_name = 'argent/entry_form.html'
def form_valid(self, form):
Savings.objects.update(id=1)
return super(EntryUpdate, self).form_valid(form)
但是,每当我使用Savings.objects.update(id=1)
或Savings.objects.filter(id=1).update()
时,都不会发生任何事情。我在这里俯瞰什么?
提前感谢您的帮助!
编辑:添加了更多细节。
答案 0 :(得分:1)
解
在nik-m的帮助下,我们终于想出了一个解决方案。这是我更新的views.py
。我不仅需要使用.update
解决方案,而且还必须包含我forms.py
内所有其他逻辑。
<强> views.py 强>
class EntryCreate(CreateView):
form_class = EntryForm
template_name = 'argent/entry_form.html'
def form_valid(self, form):
if form.save(self):
# total_euros_spent
sum_euros = Entry.objects.aggregate(s=Sum('euros_sum')).get('s')
sum_euros_f = "{0:.2f}".format(sum_euros)
# total_dollars_spent
sum_dollars = Entry.objects.aggregate(s=Sum('dollars_sum')).get('s')
sum_dollars_f = "{0:.2f}".format(sum_dollars)
# total_sum
sum_savings = Entry.objects.aggregate(s=Sum('daily_savings_dollars')).get('s')
sum_format = "{0:.2f}".format(sum_savings)
# total_sum_format
sum_abs_savings = Entry.objects.aggregate(s=Sum('daily_savings_dollars')).get('s')
absolute = abs(sum_abs_savings)
sum_abs = "{0:.2f}".format(absolute)
Savings.objects.filter(id=1).update(total_savings=sum_format, total_savings_display=sum_abs,
total_dollars_spent=sum_dollars_f, total_euros_spent=sum_euros_f)
return super(EntryCreate, self).form_valid(form)
else:
return self