2014-01-19 119 views
1

models.pyWTForms驗證綁定到模型驗證

class Invoice(Base, Timestampable): 
    __tablename__ = 'invoices' 

    issued_no = db.Column(
     db.String(16), 
     nullable=False, 
     unique=True, 
     default=lambda: Invoice.next_issued_no() 
    ) 
    issued_date = db.Column(db.DateTime, nullable=False) 
    exchange_rate = db.Column(db.Numeric(10, 2), nullable=False, default=1) 
    currency = db.Column(db.String(8), nullable=False, default='RON') 
    contract_id = db.Column(db.Integer, db.ForeignKey('contracts.id')) 
    contract = db.relationship('Contract') 
    customer_id = db.Column(db.Integer, db.ForeignKey('customers.id')) 
    customer = db.relationship('Customer') 
    due_date = db.Column(db.DateTime, nullable=False) 
    description = db.Column(db.String(255), nullable=True) 
    rows = db.relationship('InvoiceRow') 

    @classmethod 
    def next_issued_no(cls): 
     invoice = cls.query.with_entities(cls.issued_no) \ 
      .order_by(desc(cls.issued_no)).first() 
     if not invoice: 
      return '100000' 
     return int(invoice.issued_no) + 1 

forms.py

class InvoiceForm(Form): 
    issued_date = DateField(
     'Issued Date', 
     [validators.Required('Required field')], 
     format='%d/%m/%Y' 
    ) 
    exchange_rate = DecimalField(
     'Exchange Rate', 
     [validators.Required('Required field')] 
    ) 
    currency = SelectField(
     'Currency', 
     [validators.Required('Required field')], 
     choices=[ 
      ('EUR', 'EUR'), 
      ('USD', 'USD') 
     ] 
    ) 
    contract = QuerySelectField(
     'Contract', 
     query_factory=lambda: InvoiceForm.get_contracts() 
    ) 
    customer = QuerySelectField(
     'Customer', 
     query_factory=lambda: InvoiceForm.get_customers() 
    ) 
    due_date = DateField(
     'Due', 
     [validators.Required('Required field')], 
     format='%d/%m/%Y' 
    ) 
    description = TextAreaField(
     'Description', 
     [validators.Optional()], 
     filters=[strip_filter] 
    ) 
    rows = FieldList(
     FormField(InvoiceRowForm), 
     label='Rows', 
     min_entries=1 
    ) 
    //... 

我具有基於issued_no其中產生自動驗證Invoice.issued_date。 issued_date不能低於其他Invoice.issued_date,其中Invoice.issued_no較低。

e.g:

// valid 
100001 01/04/2013 
100002 01/05/2013 
100003 01/06/2013 

// invalid 
100001 01/05/2013 
100002 01/04/2013 
100003 01/06/2013 

我怎樣才能做到這一點?

回答

1

您可以將自定義驗證器添加到您的Form類。例如:

class InvoiceForm(Form): 
    # ... 

    def validate_issued_date(self, field): 
     last_invoice = Invoice.query.order_by(Invoice.issued_no.desc()).first() 
     if field.data < last_invoice.issued_date: 
      raise ValidationError('Invoice out of sequence') 
+0

不認爲這是正確的。您可以編輯以前的發票,驗證將失敗。你必須看看issued_no不只是得到最後一個。 – Viorel