Skip to content

Instantly share code, notes, and snippets.

@tsuyukimakoto
Created July 4, 2015 07:58
Show Gist options
  • Save tsuyukimakoto/675650936f59a2306133 to your computer and use it in GitHub Desktop.
Save tsuyukimakoto/675650936f59a2306133 to your computer and use it in GitHub Desktop.
Set selected wtforms.ext.sqlalchemy.fields.QuerySelectField.
diff --git a/wtforms/ext/sqlalchemy/fields.py b/wtforms/ext/sqlalchemy/fields.py
index 286dada..6c1a40e 100644
--- a/wtforms/ext/sqlalchemy/fields.py
+++ b/wtforms/ext/sqlalchemy/fields.py
@@ -56,9 +56,10 @@ class QuerySelectField(SelectFieldBase):
def __init__(self, label=None, validators=None, query_factory=None,
get_pk=None, get_label=None, allow_blank=False,
- blank_text='', **kwargs):
+ blank_text='', coerce=None, **kwargs):
super(QuerySelectField, self).__init__(label, validators, **kwargs)
self.query_factory = query_factory
+ self.coerce = coerce
if get_pk is None:
if not has_identity_key:
@@ -105,7 +106,8 @@ class QuerySelectField(SelectFieldBase):
yield ('__None', self.blank_text, self.data is None)
for pk, obj in self._get_object_list():
- yield (pk, self.get_label(obj), obj == self.data)
+ yield (pk, self.get_label(obj), obj == self.data or
+ (self.coerce is not None and self.coerce(pk) == self.data))
def process_formdata(self, valuelist):
if valuelist:
@@ -138,7 +140,7 @@ class QuerySelectMultipleField(QuerySelectField):
"""
widget = widgets.Select(multiple=True)
- def __init__(self, label=None, validators=None, default=None, **kwargs):
+ def __init__(self, label=None, validators=None, default=None, coerce=None, **kwargs):
if default is None:
default = []
super(QuerySelectMultipleField, self).__init__(label, validators, default=default, **kwargs)
@@ -146,6 +148,7 @@ class QuerySelectMultipleField(QuerySelectField):
import warnings
warnings.warn('allow_blank=True does not do anything for QuerySelectMultipleField.')
self._invalid_formdata = False
+ self.coerce = None
def _get_data(self):
formdata = self._formdata
@@ -170,7 +173,8 @@ class QuerySelectMultipleField(QuerySelectField):
def iter_choices(self):
for pk, obj in self._get_object_list():
- yield (pk, self.get_label(obj), obj in self.data)
+ yield (pk, self.get_label(obj), obj in self.data or
+ (self.coerce is not None and self.coerce(pk) in self.data))
def process_formdata(self, valuelist):
self._formdata = set(valuelist)
@osya
Copy link

osya commented Jun 4, 2016

Why are you not created PR to WTForms-Alchemy as you advised pallets-eco/wtforms#202?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment