表单中的Python Flask表单 - 更新注册过程的一部分

时间:2017-02-21 10:15:33

标签: python forms flask

我有一个用户需要注册的APP。

我有一个form用于注册数据用户名电子邮件等。

用户在同一个流程中注册一个公司,该公司可以有多个类别。

在我的数据库中,我有一个类别表,其中包含固定数量的类别,例如500。

用户注册时,他可以为公司选择最多10个类别。

问题:

我不想在页面上显示500个类别。我想有一个输入字段,用户可以尝试搜索适合他公司的类别。

我的想法:

我创建了第二个form_category。我使用此表单来限制sqlalchemy %like%的查询,所以我不必显示所有500个类别。我将它们限制为20个类别并仅显示用户输入%(如%)的相关类别:

searched_categories = session.query(Category).filter(Category.category_name.like('%'+form_category.category_search.data.strip()+'%')).limit(20)

问题

首先,我现在有一张表格。两种形式都有相同的动作。似乎第一个提交按钮始终是活动按钮,这意味着我现在只能提交form_category

即使我设法修复此问题,整个页面也会每次都重新加载,我可能会丢失以前字段中的所有输入。

更多想法:

我可以为此创建一个视图,并将已输入的数据存储在cookie中。我的初始路线是/register,如果用户搜索类别,则会转到/register/<user-input>,但感觉不对。

我还可以删除form_category并尝试使用jQuery执行所有操作,但对于noscript的人来说,该网站将无法使用。

NICE TO HVE

如果提交表单,是否有办法不重新整理整个页面,我只想重新显示页面中显示类别的部分。

这里有一些代码:

形式:

class RegisterUserForm(Form):
    # infos for user
    email = EmailField('Email', validators=[DataRequired(message="Geben Sie eine Email ein"), Email()])
    password = PasswordField('Passwort', validators=[DataRequired(message="Geben Sie ein Passwort ein"), EqualTo('confirm_password', message=u'Passwörter stimmen nicht überein'), Length(min=5, message="Passwort muss mindestens 5 Zeichen lang sein")])
    confirm_password = PasswordField('Passwort wiederholen')
    # infos for company
    company_name = TextField('Firmenname', validators=[DataRequired(message=u"Wie heißt Ihre Firma?")])
    # infos for category
    category_is_merchant = BooleanField(u"Händler")
    category_is_distributor = BooleanField(u"Großhändler")
    category_is_service = BooleanField("Diensleister")
    category_is_manufacturor = BooleanField("Hersteller")
    # etc...

class SearchCategoryForm(Form):
    category_search = TextField('Nach Branche suchen')

在我的jinja html文件中形成表单(我删除了不重要的数据):

<form class="col-xs-12" id="register-form" enctype="multipart/form-data" method="POST" action="{{ url_for('register', next=request.args.get('next')) }}">


    {{ form.hidden_tag() }}  
      <div id="content-company-data">
        <h2> Firmendaten </h2>
        <div class="content">

     <!-- some data -->

    <form class="col-xs-12" id="search-category-form" enctype="multipart/form-data" method="POST" action="{{ url_for('register', next=request.args.get('next')) }}">
    {{ form_category.hidden_tag() }}

    <div class="form-group">
    {{ form_category.category_search.label }}
    {{ form_category.category_search(class = "form-control", placeholder ="Branche") }}

    {% if form_category.category_search.data.errors %}
        {% for error in form_category.category_search.data.errors %} 
        <p class="flashes-error-form"> {{ error }}</p>
        {% endfor %}
    {% endif %}
    </div>

    <button type="submit" class="btn"> Branche suchen </button>

    </form>

    <!-- some data -->

        <button type="submit" class="btn register-button"> Jetzt Kostenlos Registrieren </button>

</form>

在我提交表格的主要py中(测试atm。与limit()):

# register site
@app.route('/registrieren', methods=["GET","POST"])
def register(): 
    if current_user.is_authenticated():
        return redirect(url_for('logged_in'))
    else:
        form = RegisterUserForm()
        form_category = SearchCategoryForm()

        searched_categories = Category.query.order_by(asc("id")).limit(4)

        if form_category.validate_on_submit():
            print "cat form validates"                
            searched_categories = Category.query.order_by(asc("id")).limit(2)

            return redirect(url_for('register'))

        if form.validate_on_submit():
            print "user form validates"

            #adding data to DB here
            return redirect(url_for('unconfirmed'))

        return render_template('register.html', form = form, form_category=form_category, searched_categories=searched_categories)

1 个答案:

答案 0 :(得分:0)

您在寻找纯Python解决方案吗?因为您的需求可以使用Ajax和自动完成标记添加jquery插件轻松实现客户端