Web2py CRUD.read() запис, създаден въпреки непопълнено условие

Така че имах функция в Web2py за създаване на запис в таблица в базата данни при условие, но Web2py създава записа, въпреки че това условие не е изпълнено,

ето я функцията

def buy_product():
    price = price_set(db,auth,'product')
    balance = limit(db,auth,'settings','account_balance')
    if balance !=None:
        if balance < price:
            form=redirect(URL('order'))
        else:
            form=crud.create(db.letter)
            if form.accepts(request.vars, session):
                tax = float(postage(form.vars.tax_type).replace("-","."))
                ##########################
                # I'm talking about this #
                ##########################
                if balance < (price + tax):
                    response.flash='You don\'t have enough balance to buy this product'
                    redirect(URL('not_processed'))
                else:
                    function_1(....)
                    ...
                    ...
                    update_field(db,auth,'settings','account_balance',-price)
                    response.flash='Done'
                    redirect(URL('products'))
                    pass
            elif form.errors:
                response.flash='Error 01'
            else:
                pass
            ###############################
    else:
        form=redirect(URL('settings'))
    return dict(form=form)

предполага се, че когато Balance < price + tax потребителят трябва да бъде пренасочен към not_processed, без да създава нов запис в базата данни.

но web2py пренасочва потребителя към not_processed и създава записа, без да изпълнява тази част с въведената информация от потребителя. така че потребителят да види, че е купил нещо, когато то не е обработено (вижте по-долу)

        function_1(....)
        ...
        ...
        update_field(db,auth,'settings','account_balance',-price)
        response.flash='Done'
        redirect(URL('products'))
        pass

някаква идея ??

Благодаря ти


person Elteroooo    schedule 03.11.2011    source източник


Отговори (1)


Crud управлява вмъквания/актуализации вътрешно и не използва form.accepts.

Имате две възможности:

1 - Използвайте SQLFORM

    form=SQLFORM(db.letter)
    if form.accepts(request.vars, session):
        tax = float(postage(form.vars.tax_type).replace("-","."))
        ##########################
        # I'm talking about this #
        ##########################

2 - Използвайте crud събития

def myfunction(form):
    # do your stuff here
    # it will be called only when form is accepted

def myotherfunction(form):
    if form.errors:
        #do something here in case of errors
        #it will be called during the form validation

crud.settings.create_onvalidation = myotherfunction
crud.settings.create_onaccept = myfunction
#the above can be:
#crud.create_onaccept = lambda form: myfunction(form)

# define the above events before the creation of the form
form=crud.create(db.letter)

Имайте предвид, че SQLFORM е малко по-различен от crud, SQLFORM очаква да валидирате формуляра в метода form.accepts, докато crud го прави вътрешно и използва събития като onvalidation, onaccept за персонализирани валидации.

person Bruno Rocha - rochacbruno    schedule 04.11.2011
comment
Трябва също така да можете да правите: form = crud.create(db.letter, onvalidation=myvalidationfunction) SQLFORM и crud приемат аргументи за валидиране. Вярвам, че след това можете да проверите допълнителни условия и да добавите грешки, ако тези условия не са изпълнени, като използвате form.errors.field = "Cannot do <something>" Споменавам го само защото може да не искате единична функция за валидиране за всички CRUD и може да имате основателна причина да използвате CRUD над SQLFORM (SQLFORM също приема параметъра за валидиране). Вижте: web2py.com/books/default/chapter/29/7#onvalidation за повече - person Kasapo; 06.06.2012