RegexValidator should accept a new parameter to perform reversed validation
|Reported by:||Si Feng||Owned by:||nobody|
|Has patch:||yes||Needs documentation:||no|
|Needs tests:||no||Patch needs improvement:||yes|
In current implementation, RegexValidator only raises ValidationError when pattern DOES NOT match regex, while it is pretty common to use a "reversed" RegexValidator that raises ValidationError when pattern MATCHES regex. A typical scenario is to catch potential XSS inputs in form field validation (if it matches then the validator should panic).
Technically such reversed match could be performed by tweaking the regex itself, however in real world, not everybody is a regex master and there are a lot of people who may prefer a more straightforward solution as simple as "not some_condition".
In my own projects, I've written a ReversedRegexValidator by subclassing RegexValidator and overriding the call() method to change it's behavior (basically it just copied everything and then removed the "not" statement). It worked well, however there are some problems:
- RegexValidator uses some Django internal utils that are not documented during upgrades. For example, in Django 1.4.x, RegexValidator used smart_unicode() from utils.encoding, while in Django 1.5.x, it changed to force_text(). The custom ReversedRegexValidator will need to be upgraded as well for such internal change.
- Overriding the whole call() method in order to just remove (or have) a "not" operation seems to be too much. But that's the current problem with RegexValidator.
So my suggestion is to add a new parameter, say "reverse", to RegexValidator. By default it's False and won't change anything to existing codes, but a user can very easily change it's matching behavior by passing reverse=True.
I've had my changes ready for review. Test cases have been updated as well.
Change History (9)
comment:6 follow-up: 7 Changed 3 years ago by
|Patch needs improvement:||set|