【问题标题】:Trying to pass a session from a Model Save into a view尝试将会话从模型保存传递到视图
【发布时间】:2017-06-23 13:12:45
【问题描述】:

我对我的一个模型进行了一些自定义验证,并根据验证失败生成错误。我想将这些错误传递给我的视图。

class TimeSheet(models.Model):

    O = "Open"
    S = "Submitted"
    A = "Approved"
    R = "Needs review"

    STATUS_CHOICES = (
    (O, "Open"),
    (S, "Submitted"),
    (A, "Approved"),
    (R, "Needs Reviewing"),
    )

    start_date = models.DateField()
    end_date = models.DateField()
    person_id = models.ForeignKey(Person)
    status = models.CharField(max_length= 50, default="Open", choices=STATUS_CHOICES)
    submitted_id = models.IntegerField(default=0)
    approved_id = models.IntegerField(default=0)
    submitted_date = models.DateTimeField(auto_now_add=True, blank=True)
    approved_date = models.DateTimeField(auto_now_add=True, blank=True)

    def get_absolute_url(self):
        return reverse('tande:timesheet', kwargs={'id': self.id})

    def save(self, *args, **kwargs):
        ok_to_continue = True
        start_date = self.start_date
        end_date = self.end_date

        if end_date < start_date:
            error = "ERROR: Start date must be before end date"
            ok_to_continue = False

        # make sure both dates are in the same month
        if start_date.month != end_date.month:
            error = "ERROR: Start and end dates must be in the same month"
            ok_to_continue = False

        # VALIDATION
        if ok_to_continue:
            super(TimeSheet, self).save(*args, **kwargs)
        else:
            print error
            self.request.session['error_from_save'] = error

但是,这会引发错误:

AttributeError: 'TimeSheet' 对象没有属性 'request'

为什么self.request.session 不起作用?还有其他方法可以将其传递回我的视图吗?

【问题讨论】:

    标签: python django session request save


    【解决方案1】:

    覆盖模型的save() 方法不是进行验证的首选方法。您应该为模型中的每个字段提供validators 属性并为它们提供custom-written validators,或者在override the clean_fieldname methods of your form 所在的(模型)表单中进行验证。

    您不能从模型的 save 方法将内容传递回视图的原因是可能并不总是从视图调用 save 方法。例如,它可以从 shell 调用。所以不会总是有视图或会话可以返回。

    【讨论】:

    • 嗯,有道理。我会试试的。覆盖模型保存有什么问题?只是因为我现在将它保存为一个对象,因为我无法让表单使用 ajax(验证问题)并将数据返回到视图。
    • 验证应该在save 之前运行。通过您的自定义检查ok_to_continue = True,您有效地重新定义了已经通过cleanclean_* 和验证器实现的Django 流程。这些也可能在未调用 save 的情况下运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 2016-11-21
    • 2013-11-20
    相关资源
    最近更新 更多