我有一个用户需要注册的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)
答案 0 :(得分:0)
您在寻找纯Python解决方案吗?因为您的需求可以使用Ajax和自动完成标记添加jquery插件轻松实现客户端