code: def get_field_errors(self, bound_field):
          
          errors = super(NgFormValidationMixin, self).get_field_errors(bound_field)
          if bound_field.is_hidden:
              return errors
          identifier = format_html('{0}[\'{1}\']', self.form_name, self.add_prefix(bound_field.name))
          potential_errors = bound_field.field.get_potential_errors()
          errors.extend([SafeTuple((identifier, self.field_error_css_classes, '$dirty', pe[0], 'invalid', force_text(pe[1])))
                         for pe in potential_errors])
          if not isinstance(bound_field.field.widget, widgets.PasswordInput):
              # all valid fields shall display OK tick after changed into dirty state
              errors.append(SafeTuple((identifier, self.field_error_css_classes, '$dirty', '$valid', 'valid', '')))
              if bound_field.value():
                  # valid bound fields shall display OK tick, even in pristine state
                  errors.append(SafeTuple((identifier, self.field_error_css_classes, '$pristine', '$valid', 'valid', '')))
          return errors
docs: Determine the kind of input field and create a list of potential errors which may occur
          during validation of that field. This list is returned to be displayed in '$dirty' state
          if the field does not validate for that criteria.