【发布时间】:2014-11-16 16:51:31
【问题描述】:
我目前正在使用 wtf 处理地址表单,其中包含 Country、State、City..etc。数据库全部用FK设置。
class Country(db.Model):
__tablename__ = 'countries'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
users = db.relationship('User', backref='countries', lazy='dynamic')
class City(db.Model):
__tablename__ = 'cities'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
countries_id = db.Column(db.Integer, db.ForeignKey('countries.id'))
现在我正在尝试实现链式选择字段排序效果以优化用户体验。想要的效果是不离开或刷新页面,让selectfield根据之前的selectfield拉取数据。
例如,用户在 Country 中选择了澳大利亚,那么 State 的第二个选择字段应该只包含澳大利亚的州。
我已经对此主题进行了一些研究,但无法提出令人满意的解决方案。这是我找到的两个可能但不令人满意的解决方案。
1.使用 jQuery 插件,例如链式的。但是,此插件需要逐行编码。如果我采用这个解决方案,至少还有 400 多行,这不是很 Pythonic。例如:
<select id="series" name="series">
<option value="">--</option>
<option value="series-3" class="bmw">3 series</option>
<option value="series-5" class="bmw">5 series</option>
<option value="series-6" class="bmw">6 series</option>
<option value="a3" class="audi">A3</option>
<option value="a4" class="audi">A4</option>
<option value="a5" class="audi">A5</option>
</select>
2.使用 Wtf 的“使用动态选择值选择字段”,这也是不可取的,因为它只根据前一个选择字段的默认值提取数据一次。例如:如果国家/地区的默认选择字段是澳大利亚,则州选择字段将仅包含澳大利亚境内的州。当您将国家/地区选择字段更改为美国时,州选择字段仍将仅包含澳大利亚境内的州。以下是 wtf 文档中列出的此方法的教程:
class UserDetails(Form):
group_id = SelectField(u'Group', coerce=int)
def edit_user(request, id):
user = User.query.get(id)
form = UserDetails(request.POST, obj=user)
form.group_id.choices = [(g.id, g.name) for g in Group.query.order_by('name')]
根据上述研究,我认为令人满意的解决方案应该介于两者之间,并且肯定应该涉及一些 Javascript 来监视客户端活动,而无需向服务器发送请求。有人对flask框架有满意的解决方案吗?
【问题讨论】:
标签: jquery python flask jinja2 flask-wtforms