2015-01-12 3 views
1

Чтобы сделать мой вопрос более ясным, вот небольшое приложение, которое принимает предложение предложения и выводит это предложение дважды.Как перемещать фляжку из расширенного вида в расширенный вид и создавать формы для всех видов?

У меня есть base.html:

<html> 
    <head> 
    <title> My site </title> 
    <body> 
    {% block content %}{% endblock %} 
    </body> 
</html> 

и index.html:

{% extends "base.html" %} 
{% block content %} 
{{ s }} 
<form action="" method="post" name="blah"> 
    {{ form.hidden_tag() }} 
    {{ form.sentence(size=80) }} 
    <input type="submit" value="Doubler"></p> 
</form> 
{% endblock %} 

Вот часть views.py:

from forms import DoublerForm 

@app.route('/index') 
def index(): 
    form = DoublerForm() 
    if form.validate_on_submit(): 
     s = form.sentence.data 
     return render_template('index.html', form=form, s=str(s) + str(s)) 
    return render_template('index.html', form=form, s="") 

А вот forms.py, без всех импорта:

class DoublerForm(Form): 
    sentence = StringField(u'Text') 

Это похоже на работу ОК. Но я хотел бы иметь свою форму ввода в шаблоне base.html, чтобы это отображалось на всех страницах, которые его расширили, а не только на странице index. Как я могу переместить форму в base.html и создать экземпляр формы для всех представлений, расширяющих base.html?

ответ

2

You can use the flask.g object and flask.before_request.

from flask import Flask, render_template, g 
from flask_wtf import Form 
from wtforms import StringField 

@app.before_request 
def get_default_context(): 
    """ 
    helper function that returns a default context used by render_template 
    """ 
    g.doubler_form = DoublerForm() 
    g.example_string = "example =D" 

@app.route('/', methods=["GET", "POST"]) 
def index(): 
    form = g.get("doubler_form") 
    if form.validate_on_submit(): 
     s = form.sentence.data 
     return render_template('index.html', form=form, s=str(s) + str(s)) 
    return render_template('index.html', form=form, s="") 

Вы можете также явно определить контекст функции

def get_default_context(): 
    """ 
    helper function that returns a default context used by render_template 
    """ 
    context = {} 
    context["doubler_form"] = form = DoublerForm() 
    context["example_string"] = "example =D" 
    return context 

и используется как этот

@app.route('/faq/', methods=['GET']) 
def faq_page(): 
    """ 
    returns a static page that answers the most common questions found in limbo 
    """ 
    context = controllers.get_default_context() 
    return render_template('faq.html', **context) 

Теперь вы будете иметь все объекты, которые вы добавить контекстный словарь доступен во всех шаблонах, которые распаковывают словарь контекста.

index.html

{% extends "base.html" %} 
{% block content %} 
{{ s }} 
{% endblock %} 

base.html

<html> 
    <head> 
    <title> My site </title> 
    <body> 
    {% block content %}{% endblock %} 
    <form action="" method="post" name="blah"> 
     {{ doubler_form.hidden_tag() }} 
     {{ doubler_form.sentence(size=80) }} 
     {{ example_string }} 
     <input type="submit" value="Doubler"></p> 
    </form> 
    </body> 
</html> 
+0

Нет, я хотел бы форму, чтобы быть встроены в 'base.html' так, чтобы он автоматически получает показать на всех страницах, которые проходят Это. – theQman

+0

Вы хотите, чтобы форма использовалась в индексе, или это может произойти после того, как блок контента, например, мои изменения? – AlexLordThorsen

+0

Его не нужно использовать в индексе, но теперь откуда идет объект 'form'? В моем коде он был создан в 'index()'; Я не хочу создавать экземпляр его во всех других функциях, расширяющих 'base.html'. – theQman