2017-02-06 7 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という(モデル)フォームの検証を行う必要があります。

モデルのsaveメソッドからビューに戻すことができないのは、ビューからsaveメソッドが呼び出されるとは限りません。たとえば、シェルから呼び出すことができます。だから、いつも物事を返すための眺めやセッションがあるとは限りません。

+0

ああ大丈夫です。私はそれを試みます。モデルの保存をオーバーライドすると何が問題になりますか?なぜなら、フォームをajax(検証の問題)で動作させてデータをビューに戻すことができなかったため、私は現時点でオブジェクトとして保存しているからです。 –

+0

検証は 'save'の前に実行する必要があります。カスタムチェック 'ok_to_continue = True'を使うと、' clean'、 'clean_ *'とバリデータを使って既に実装されているDjangoプロセスを効果的に再利用できます。これらは、 'save'が呼び出されない状況でも実行されるかもしれません。 – Risadinha

関連する問題