python - Django ValidationError View 中?!不形成

标签 python django

我在验证 Django Form 时遇到问题,因为我当然无法在清理之前保存模型。我有预订模型:

class Reservation(models.Model):
    from = models.DateTimeField()
    to = models.DateTimeField()
    total_price = models.DecimalField()
    paid = models.DecimalField()

    def calculate_price(self):
        self.total_price = some_magic(self.from, self.to)

和形式:

class ReservationForm(forms.ModelForm):
    payment_amount = forms.DecimalField()

    class Meta:
        model = Reservation

    def clean(self):
        ????

我想在干净的方法中验证 payment_amount 是否不大于total_price 但total_price 未更新 - 我在保存模型后调用calculate_price()。

价格计算后我可以在 View 中引发 ValidationError 吗?

最佳答案

您可以考虑将 calculate_price 的内容放入不修改 Reservation 模型实例数据的方法中。

例如,目前您有假装函数some_magic。在 clean 中,你可以输入如下内容:

def clean(self):
    data = super(ReservationForm, self).clean()
    total_price = some_magic(data.get('from'), data.get('to'))
    if data.get('payment_amount') > total_price:
        raise ValidationError("Payment amount should not exceed total price of $%s" % total_price)
    return data

这个想法是将价格计算的计算与将其保存在模型上的行为分开,以便它可以在多个地方使用(即模型保存方法表单验证)。

关于python - Django ValidationError View 中?!不形成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32778187/

相关文章:

python - 如何在python输出控制台中仅清除最后一行?

python - 为什么 tensorflow 将 one_hot 值加倍?

python - 获取列 "number"和列名称,以便更轻松地在 pandas 的大型 df 中选择多个(并不总是相邻)列

python 的日期时间机制

django - 何时在 Django 中使用 HttpResponseBadRequest (http 400)

Django:向特定模型实例添加权限

mysql - 如何清理或随机化敏感的数据库字段

python - 你能从 Python 中的 main() 函数返回一个值吗?

python - 如何在模板中获取 ImageField URL?

python - 为 CRUD 操作设计 Django 表单的最佳实践