Найти - Пользователи
Полная версия: Wtforms hiddenfield, как получить значение
Начало » Web » Wtforms hiddenfield, как получить значение
1 2
Mazay_Ka
Привет, всем такой вопросик
есть форма, в которой я заполняю ответ на определенный вопрос


class AnswerForm(Form):
    text = StringField('Answer', widget=TextArea(), validators = [DataRequired()])
    quest = HiddenField('Quest')
@app.route('/answer', methods = ['POST', 'GET'])
def answer():
    a_form = AnswerForm() 
    if a_form.validate_on_submit(): 
        answer = a_form.text.data
        quest = a_form.quest.data # сюда в темплейте присвоить значение чтобы я тут его мог обработать
        print answer, quest

темплэйт

{% for answer in post.answer%}
<form action="{{url_for('answer')}}" method='post' name='answer'>
{{ a_form.hidden_tag() }}	
<tr id = "{{post.id}}"><td>{{a_form.text}}
{{a_form.quest(data=post.id)}}</td></tr>
	<tr><td><input type="submit" value="Answer"/></td></tr>
</form>
{%endfor%}
Как тут присвоить значение форме quest чтобы я мог его получить и использовать далее в базе.



sander
Mazay_Ka
{% for answer in post.answer%}
<form action=“{{url_for('answer')}}” method='post' name='answer'>
{{ a_form.hidden_tag() }}
<tr id = “{{post.id}}”><td>{{a_form.text}}
{{a_form.quest(data=post.id)}}</td></tr>
<tr><td><input type=“submit” value=“Answer”/></td></tr>
</form>
{%endfor%}

что это за безумие?
если ты передаешь обьект post в шаблон, значит он уже есть у тебя в вьюхе и тебе не нужно ничего делать в шаблоне
Mazay_Ka
sander
там в шаблоне в цикле пишутся вопросы(post), потом когда я делаю ответ фугкцией answer, нужен post.id для того чтобы понять к какому вопросу приписать ответ.
Пардон может криво изьясняюсь.
sander
я бы сделал как то так
@app.route('/answer', methods = ['GET'])
@app.route('/answer/<int:post_id>', methods = ['POST'])
def answer(post_id=None):
    a_form = AnswerForm() 
    if a_form.validate_on_submit(): 
       # получаем необходимый пост
        post = PostModel.query.get_or_404(post_id) # если используется flask-sqlalchemy
        answer = a_form.text.data
    
в шаблоне в цикле
<form action="{{ url_for('answer', post_id=post.id) }} method="post">
    {{ a_form.hidden_tag() }}	
     <tr><td>{{a_form.text}}</td></tr>
     <tr><td><input type="submit" value="Answer"/></td></tr>
</form>
Mazay_Ka
Спасибо это именно то что спрашивал, красиво сделали)
4kpt_III
Есть еще вариант. ajax. Немножко кода, но будет значительно элегантнее…

P.S. В формах можно явно передавать значение в поле, хотя с hidden я, честно говоря, не работал.
Mazay_Ka
Пробывал js передавать, тоже получается норм.
Просто пытаюсь разобраться с этими формами как этому hidden присвоить значение, а потом его получить перерыл менюалы и так и не понял.
4kpt_III
В обычное поле передается так.

{% for field in form %}
    {{ field(value=post.id) }}
{% endfor %}

C hidden нужно проверять. Но я думаю близко должно быть
Mazay_Ka
sander
я бы сделал как то так

в вашем способе в итоге получается ошибка
q = models.Quest.query.get(post_id)

File “C:\Python27\lib\site-packages\sqlalchemy\orm\query.py”, line 798, in get

if len(ident) != len(mapper.primary_key):

TypeError: object of type ‘NoneType’ has no len()
а post_id все время None
хотя в урле его видно
http://127.0.0.1:5000/make_answer?post_id=2
функция
@app.route('/make_answer', methods = ['POST', 'GET'])
@app.route('/make_answer/<int:post_id>', methods = ['POST'])
@login_required
def answer(post_id = None):
    t_body = str(datetime.datetime.now()).split('.')
    t= t_body[0]
    a_form = AnswerForm() 
    if a_form.validate_on_submit(): 
        answer = a_form.text.data
        print post_id   
        q = models.Quest.query.get(post_id)
        a = models.Answer(body=answer, time=datetime.datetime.now(), author = g.user, quest = q, t_body = t)

шаблон в цикле
<form action="{{ url_for('answer', post_id = post.id) }}" method='post'>
{{ a_form.hidden_tag() }}	
<tr id = "{{post.id}}"><td>{{a_form.text}}</td></tr>
	<tr><td><input type="submit" value="Answer"/></td></tr>
</form>
sander
Mazay_Ka
попробуй поменять местами роуты
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB