Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python WTForms验证绑定到模型验证_Python_Flask_Wtforms_Flask Wtforms - Fatal编程技术网

Python WTForms验证绑定到模型验证

Python WTForms验证绑定到模型验证,python,flask,wtforms,flask-wtforms,Python,Flask,Wtforms,Flask Wtforms,型号.py 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.Colum

型号.py

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
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
    )
    //...
forms.py

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
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
    )
    //...
我必须根据自动生成的发票号来验证发票签发日期。发出日期不能低于任何其他发票。发出日期,其中Invoice.issued\u no较低

e、 g:


我如何才能做到这一点?

您可以向表单类添加自定义验证器。例如:

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')
类发票表单(表单):
# ...
def验证发布日期(自我,字段):
last_invoice=invoice.query.order_by(invoice.issued_no.desc()).first()
如果field.data<上次发票开具日期:
引发ValidationError('发票顺序错误')

我认为这是不对的。您可以编辑以前的发票,验证将失败。你必须看一看,不只是最后一个。