SQLAlchemy / WTForms: установить выбранное значение по умолчанию для QuerySelectField

Этот [пример] [1] для настройки формы с WTForms и SQLAlchemy во Flask и добавления QuerySelectField в форму работает. Я не использую flask.ext.sqlalchemy, мой код:

ContentForm = model_form(Content, base_class=Form)
ContentForm.author = QuerySelectField('Author', get_label="name")
myform = ContentForm(request.form, content)
myform.author.query = query_get_all(Authors)

Теперь я хочу установить значение по умолчанию для списка выбора QuerySelectField.

Пытался передать default kwarg в QuerySelectField и установить атрибуты selected. Ничего не получилось. Я упускаю что-то очевидное? Может кто поможет?


person casual    schedule 05.02.2014    source источник


Ответы (2)


Вам необходимо установить аргумент ключевого слова default для экземпляра Authors, который вы хотите использовать по умолчанию:

# Hypothetically, let's say that the current user makes the most sense
# This is just an example, for the sake of the thing
user = Authors.get(current_user.id)
ContentForm.author = QuerySelectField('Author', get_label='name', default=user)

В качестве альтернативы вы можете предоставить экземпляр полю при создании экземпляра:

# The author keyword will only be checked if
# author is not in request.form or content
myform = ContentForm(request.form, obj=content, author=user)
person Sean Vieira    schedule 05.02.2014
comment
Первый метод не дает никакого эффекта. Второй вызывает TypeError: 'ContentForm' object is not callable исключение ... - person casual; 05.02.2014
comment
@casual - извините, второй должен был быть для создания экземпляра myform - обновлен. (Что касается первого, что произойдет, если вы используете id автора ... Я не думаю, что он должен работать, глядя на код, но не помешает попробовать это) - person Sean Vieira; 05.02.2014
comment
Странно, но единственная ситуация, когда поле выбора имеет правильное значение по умолчанию, это myform = ContentForm(request.form, author=user). Но тогда, конечно, все остальные поля формы пусты. Может ли это быть проблемой с запросами Flask? - person casual; 05.02.2014
comment
@casual - я пропустил obj=, который я должен был использовать для content - нам нужно проверить request.form, и, если там нет содержимого, заполнить форму данными из obj (в данном случае content, и если content не имеет author, используйте author, который мы предоставляем через аргументы ключевого слова. Я обновил свой второй пример, и теперь он должен работать. - person Sean Vieira; 05.02.2014
comment
Где-то в моем коде была ошибка. Ваш ответ работает. - person casual; 09.03.2014
comment
Как мне получить значение selected QuerySelectField. Например, для моей страны выберите раскрывающийся список country = QuerySelectField(query_factory=Country.query.all, get_pk=lambda a: a.id, get_label=lambda a: a.name) Я получаю объект <models.Country object at 0xaa1550c>. Как мне получить значение страны, скажем 1, 2, 3 и т. Д. - person Hussain; 21.04.2015
comment
Поскольку data будет фактическим экземпляром, вы можете просто сделать your_field.data.id, чтобы получить идентификатор, и your_field.data.YOUR_FIELD_NAME, чтобы получить информацию в этом поле. - person Sean Vieira; 21.04.2015

Попробуй это:

ContentForm.author = QuerySelectField(
    'Author', 
    get_label="name", 
    default=lambda: Authors.get(current_user.id).one()
)
person aribo    schedule 18.07.2018