我们从Python开源项目中,提取了以下4个代码示例,用于说明如何使用wtforms.FieldList()。
def generate_household_composition_form(block_json, data, error_messages): class HouseHoldCompositionForm(FlaskForm): question_errors = {} household = FieldList(FormField(get_name_form(block_json, error_messages)), min_entries=1) def map_errors(self): ordered_errors = [] if 'household' in self.errors and self.errors['household']: for index, field in enumerate(self.household): ordered_errors += map_field_errors(field.errors, index) return ordered_errors def answer_errors(self, input_id): return [error[1] for error in self.map_errors() if input_id == error[0]] def remove_person(self, index_to_remove): popped = [] while index_to_remove != len(self.household.data): popped.append(self.household.pop_entry()) popped.reverse() for field in popped[1:]: self.household.append_entry(field.data) def serialise(self, location): """ Returns a list of answers representing the form data :param location: The location to associate the form data with :return: """ return serialise_composition_answers(location, self.household.data) return HouseHoldCompositionForm(MultiDict(data))
def attachment_form_group_create(schema_prop): """Creates a wtforms.FieldList for attachments.""" file_select_form_group = _attachment_build_single_field(schema_prop) field = wtforms.FieldList(CustomFormField(file_select_form_group), min_entries=1) return field
def generate_relationship_form(block_json, number_of_entries, data, error_messages): answer = SchemaHelper.get_first_answer_for_block(block_json) class HouseHoldRelationshipForm(FlaskForm): question_errors = {} def map_errors(self): ordered_errors = [] if self.errors: for answer_id, error_list in self.errors.items(): for errors in error_list: for error in errors: ordered_errors.append((answer_id, error)) return ordered_errors def answer_errors(self, input_id): return [error[1] for error in self.map_errors() if input_id == error[0]] def serialise(self, location): """ Returns a list of answers representing the form data :param location: The location to associate the form data with :return: """ list_field = getattr(self, answer['id']) return serialise_relationship_answers(location, answer['id'], list_field.data) choices = [('', 'Select relationship')] + build_choices(answer['options']) field = FieldList(SelectField( label=answer.get('guidance'), description=answer.get('label'), choices=choices, default='', validators=get_mandatory_validator(answer, error_messages, 'MANDATORY_TEXTFIELD'), ), min_entries=number_of_entries) setattr(HouseHoldRelationshipForm, answer['id'], field) if data: form = HouseHoldRelationshipForm(MultiDict(data)) else: form = HouseHoldRelationshipForm() return form
def add_form_properties(form_class, node_type): """Add fields to a form based on the node and form schema provided. :type node_schema: dict :param node_schema: the validation schema used by Cerberus :type form_class: class :param form_class: The form class to which we append fields :type form_schema: dict :param form_schema: description of how to build the form (which fields to show and hide) """ for prop_name, schema_prop, form_prop in iter_node_properties(node_type): # Recursive call if detects a dict field_type = schema_prop['type'] if field_type == 'dict': assert prop_name == 'attachments' field = attachments.attachment_form_group_create(schema_prop) elif field_type == 'list': if prop_name == 'files': schema = schema_prop['schema']['schema'] file_select_form = build_file_select_form(schema) field = FieldList(CustomFormField(file_select_form), min_entries=1) elif 'allowed' in schema_prop['schema']: choices = [(c, c) for c in schema_prop['schema']['allowed']] field = SelectMultipleField(choices=choices) else: field = SelectMultipleField(choices=[]) elif 'allowed' in schema_prop: select = [] for option in schema_prop['allowed']: select.append((str(option), str(option))) field = SelectField(choices=select) elif field_type == 'datetime': if form_prop.get('dateonly'): field = DateField(prop_name, default=date.today()) else: field = DateTimeField(prop_name, default=datetime.now()) elif field_type == 'integer': field = IntegerField(prop_name, default=0) elif field_type == 'float': field = FloatField(prop_name, default=0.0) elif field_type == 'boolean': field = BooleanField(prop_name) elif field_type == 'objectid' and 'data_relation' in schema_prop: if schema_prop['data_relation']['resource'] == 'files': field = FileSelectField(prop_name) else: field = StringField(prop_name) elif schema_prop.get('maxlength', 0) > 64: field = TextAreaField(prop_name) else: field = StringField(prop_name) setattr(form_class, prop_name, field)