2016-10-13 2 views
0

S'il vous plaît considérer le tableau suivant:Web2py Valeur du champ dépend d'un autre champ - (validation tout en définissant le modèle)

db.define_table('bio_data', 
      Field('name', 'string'), 
      Field('total_mark', 'integer', requires=IS_EMPTY_OR(IS_INT_IN_RANGE(0, 1e100))), 
      Field('marks_obtained', 'integer') 
      ) 

Maintenant, le champ « marks_obtained » ne peut pas avoir une valeur supérieure à la « total_marks ».

J'ai essayé ce qui suit

db.bio_data.marks_obtained.requires = IS_EMPTY_OR(
IS_INT_IN_RANGE(0, db.bio_data.total_mark)) 

Mais cela ne fonctionne pas. J'obtiens l'erreur suivante:

TypeError: int() argument must be a string or a number, not 'Field' 

Toute aide est très appréciée.

+0

trouver un moyen d'obtenir la valeur entière de 'Field'. –

+0

Oui c'est la question ici, comment puis-je obtenir une valeur au lieu d'un champ. J'ai essayé ce qui suit, mais encore obtenir l'erreur: champ '('marks_obtained', 'entier', nécessite = rang lambda: IS_EMPTY_OR (IS_INT_IN_RANGE (0, db.bio_data (row.id) .total_mark)))' Et vous demander de s'il vous plaît ne pas downvote sans comprendre l'ensemble du problème ou des connaissances. –

+0

pouvez-vous taper 'dir (db.bio_data.total_mark)' et voir ce qu'il renvoie? Avez-vous juste essayé 'int (db.bio_data.total_mark)' –

Répondre

1

Vous pouvez facilement faire cela en utilisant la fonction de rappel onvalidation. Lisez ce Form and validators - onvalidation

deuxième solution est que vous devez combiner « validateurs avec dépendances » et IS_EXPR validateur. Lire:

  1. Validators with dependencies

  2. IS_EXPR

Ajouter au validateur contrôleur quelque chose comme suit, je ne l'ai pas testé cela, mais vous obtiendrez idée de cette situation.

is_total_less = int(request.vars.marks_obtained) < int(request.vars.total_mark) 

db.bio_data.marks_obtained.requires = IS_EMPTY_OR(
IS_EXPR('%s' % is_total_less, 
     error_message='Marks Obtained should be smaller than Totak Marks')) 

Assurez-vous que request.vars est disponible.

+1

J'ai été capable de le faire en utilisant le rappel 'onvalidation'. Pour le niveau du modèle, je vais essayer la même chose et mettre à jour. Merci pour la mise à jour. –