2017-02-06 1 views
1

У меня есть специальная проверка на одной из моих моделей, и я генерирую ошибки, на основании которых не удалось выполнить проверку. Я хочу передать эти ошибки на мой взгляд.Пытается пройти сеанс из модели Сохранить в виде

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' object has no attribute 'request'

Почему self.request.session не работает? Есть ли другой способ передать это мне на мой взгляд?

ответ

3

Переопределение метода модели save() не является предпочтительным способом проверки. Вы должны либо указать атрибут validators для каждого поля вашей модели и предоставить их custom-written validators, либо выполнить проверку в форме (модели), где вы находитесь override the clean_fieldname methods of your form.

Причина, по которой вы не можете передать данные в вид из метода сохранения модели, заключается в том, что метод сохранения не всегда может вызываться из представления. Например, он может быть вызван из оболочки. Таким образом, не всегда будет представление или сеанс, чтобы возвращать вещи.

+0

Ах, хорошо, что имеет смысл. Я попробую. В чем проблема с отменой сохранения модели? Просто потому, что я сохраняю его как объект на данный момент, потому что я не мог получить формы для работы с ajax (проблемы проверки) и вернуть данные в представление. –

+0

Проверка должна выполняться до 'save'. С вашей пользовательской проверкой 'ok_to_continue = True' вы эффективно переустанавливаете процесс Django, который уже реализован с помощью' clean', 'clean_ *' и валидаторов. Они также могут работать в обстоятельствах, когда 'save' не вызывается. – Risadinha

Смежные вопросы