Я использую Flask для создания веб-приложения.
В двух словах: Когда мы отправляем форму, которая использует QuerySelectField + sqlalchemy для заполнения поля выбора, фактическое значение отправляетсякажется первичным ключом, но что, если мне нужно передать другое значение? Скажем, в таблице два столбца: ID и Item, теперь ID является первичным ключом, но пользователь выбирает строку не по идентификатору первичного ключа, а по Item, то есть то, что он видит в именах элементов, а не в идентификаторах первичного ключа. Но форма отправляет идентификаторы, я хочу вместо этого отправить имена элементов.
Мне трудно это объяснить, поэтому здесь длинная версия
Длинное объяснение
У меня есть модель, в которой таблица нутриональных значений содержит два столбца: «id» - первичный ключ и столбец «item» - названия продуктов.
class nutritionalvalues(db.Model):
id = db.Column(db.Integer, primary_key=True)
item = db.Column(db.String(200), nullable=False)
def __repr__(self):
return '{}'.format(self.item)
Теперь используетсяsqlalchemy и flaskforms
def choice_query():
return nutritionalvalues.query
class ChoiceForm(FlaskForm):
item = QuerySelectField(query_factory=choice_query, allow_blank=False)
Я создаю класс 'ChoiceForm' и использую его для создания формы с
form = ChoiceForm()
return render_template('index.html', form=form)
В шаблоне index.html у меня есть разметка
<form action="/" method="POST">
{{ form.csrf_token }}
{{ form.item }}
<input type="submit" value="Add Item">
</form>
, который при рендеринге браузера генерирует HTML-код
<form action="/" method="POST">
<select id="item" name="item">
<option value="1"><nutritionalvalues 1></option>
<option value="2"><nutritionalvalues 2></option>
<option value="3"><nutritionalvalues 3></option>
</select>
<input type="submit" value="Add Item">
</form>
Теперь, скажем, я использую аргумент 'get_label', я могу изменить параметры выбора на фактические элементы
class ChoiceForm(FlaskForm):
item = QuerySelectField(query_factory=choice_query, allow_blank=False, get_label='item')
, поэтому html рендерит вот так
<form action="/" method="POST">
<select id="item" name="item">
<option value="1">bread</option>
<option value="2">salmon</option>
<option value="3">pork</option>
</select>
<input type="submit" value="Add Item">
</form>
, но при отправке формы поле выбора возвращает «1» для «хлеба», но я хочу, чтобы оно возвращало «хлеб»
, потому чтоЗатем я использую это для ввода этих данных в другую таблицу следующим образом
if request.method == 'POST':
food_item = request.form['item']
new_food = eaten(item=food_item)
try:
db.session.add(new_food)
db.session.commit()
return redirect('/')
и я не хочу вводить «1» как еду, которую я только что съел, я хочу ввести «хлеб».
Так как я могу использовать QuerySelectField + sqlalchemyинструментарий запроса для передачи фактического имени элемента обратно при отправке формы?