Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fixed SelectMultipleField none_of validator #538

Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion src/wtforms/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -594,10 +594,20 @@ def __init__(self, values, message=None, values_formatter=None):
self.values_formatter = values_formatter

def __call__(self, form, field):
if field.type == "SelectMultipleField":
Copy link
Member

@davidism davidism Apr 21, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This can't be the solution, as it excludes any other fields that have a list of data. And it just doesn't feel very good to check the name of a specific field like this.

Could maybe do if isinstance(field.data, list). That might have issues with FieldList, but that might not matter. Would also have issues if you want to check "none of these specific sets of choices", rather than "doesn't contain any of these choices".

if any(e in self.values for e in field.data):
message = self.message
if message is None:
message = field.gettext('Invalid value, cannot be any of: %(values)s.')

raise ValidationError(
message % dict(values=self.values_formatter(self.values))
)

if field.data in self.values:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the field is SelectMultipleField, this behavior still triggers if the new if block doesn't raise. That would sort of address my point about validating lists vs items, but it doesn't seem like the right design because there's still no way to control which type of validation you intended.

message = self.message
if message is None:
message = field.gettext("Invalid value, can't be any of: %(values)s.")
message = field.gettext("Invalid value, cannot be any of: %(values)s.")

raise ValidationError(
message % dict(values=self.values_formatter(self.values))
Expand Down