在 QuerySelectField 中设置默认值(由对象初始化的表单)
Set default value in QuerySelectField (Form initialized by object)
我需要在 QuerySelectField 中设置默认值。如果表单为空(添加对象)- 设置默认值可以正常工作。但是如果表单在(编辑一个对象)之前被初始化,我不知道如何设置默认值。
我已经尝试过这里建议的 formfactory:enter link description here
...不起作用...
我们有公司、(公司的)分支机构和银行账户。
每个分支机构都属于一家公司,并有自己的银行账户。
如果我编辑分支机构,则必须在 dropdwon 中将适当的公司和银行帐户设置为默认值。
所以我现在尝试处理这两天... - 我的错误在哪里?请帮忙!
C.
以下是片段:
模特:
class TBranch(db.Model):
__tablename__ = 't_branch'
idt_branch = db.Column(db.Integer, primary_key=True, info='ID of the branch')
t_company_idt_company = db.Column(db.ForeignKey('t_company.idt_company'), nullable=False, index=True,
info='id of the company')
shortname = db.Column(db.String(10), nullable=False, unique=True)
name = db.Column(db.String(45), nullable=False, info='Bankverbindung - taken from t_kto')
mail = db.Column(db.String(45), nullable=False, info='mailadress of the branch')
idt_bankaccount = db.Column(db.ForeignKey('t_bankaccount.idt_bankaccount'), nullable=False, index=True)
t_bankaccount = db.relationship('TBankaccount',
primaryjoin='TBranch.idt_bankaccount == TBankaccount.idt_bankaccount',
backref='t_branches')
t_company = db.relationship('TCompany', primaryjoin='TBranch.t_company_idt_company == TCompany.idt_company',
backref='t_branches')
class TCompany(db.Model):
__tablename__ = 't_company'
idt_company = db.Column(db.Integer, primary_key=True, info='ID of the company')
company = db.Column(db.String(45), nullable=False, info='company - xxxxx')
longname = db.Column(db.String(45), nullable=False,
info='Name of the company (xxxx)')
street = db.Column(db.String(50), nullable=False, info='Strasse')
plz = db.Column(db.String(10), nullable=False, info='plz of the company')
city = db.Column(db.String(45), nullable=False, info='City of the company')
phone = db.Column(db.String(45), nullable=False, info='Telephone number of the Company')
fax = db.Column(db.String(45), nullable=False, info='Fax number of the company')
web = db.Column(db.String(45), nullable=False, info='Webadress of the company')
taxid = db.Column(db.String(45), nullable=False, info='Steuernmmer')
firmenbuch = db.Column(db.String(45), info='Firmenbuchnummer')
gericht = db.Column(db.String(45), info='Gerichtsstand')
class TBankaccount(db.Model):
__tablename__ = 't_bankaccount'
idt_bankaccount = db.Column(db.Integer, primary_key=True, info='ID of the bankaccount dataset')
name = db.Column(db.String(45), nullable=False, info='Name of the bankaccount')
iban = db.Column(db.String(50), nullable=False, info='iban of the bankaccount')
bic = db.Column(db.String(50), nullable=False, info='bic of the bankaccount')
表单 - 如果没有传递任何对象,则设置默认值有效
class BranchForm(FlaskForm):
"""
Form for admin to add or edit the branches (Schulzweig)
"""
company = QuerySelectField(query_factory=lambda: TCompany.query.all(),
get_pk=lambda a: a.idt_company,
# default=lambda: TCompany.query.filter(TCompany.idt_company == 2).one_or_none(),
get_label=lambda a: a.longname)
shortname = StringField('Shortname', validators=[DataRequired()])
name = StringField('Name', validators=[DataRequired()])
mail = StringField('Mail', validators=[DataRequired()])
bankaccount = QuerySelectField(query_factory=lambda: TBankaccount.query.all(),
# default=lambda: TBankaccount.query.filter(TBankaccount.name == "xxx").one_or_none(),
get_label="name")
submit = SubmitField('Speichern')
Formfactory(设置默认不起作用...)
def add_branch_form_factory(default_company, default_bankaccount):
print("addbranch, company: " + str(default_company))
print("addbranch, bankaccount: " + str(default_bankaccount))
class AddBranchForm(FlaskForm):
"""
Form for admin to add or edit the branches (Schulzweig)
"""
company = QuerySelectField(query_factory=lambda: TCompany.query.all(),
#get_pk=lambda c: c.idt_company,
default=TCompany.query.filter_by(idt_company=default_company).one_or_none(),
get_label="longname")
shortname = StringField('Shortname', validators=[DataRequired()])
name = StringField('Name', validators=[DataRequired()])
mail = StringField('Mail', validators=[DataRequired()])
bankaccount = QuerySelectField(query_factory=lambda: TBankaccount.query.all(),
# get_pk=lambda b: b.idt_bankaccount,
default=TBankaccount.query.filter(
TBankaccount.idt_bankaccount == default_bankaccount).one_or_none(),
get_label=lambda b: b.name)
submit = SubmitField('Speichern')
景色
@admin.route('/branches/edit/<int:idt_branch>', methods=['GET', 'POST'])
@login_required
def edit_branch(idt_branch):
"""
Edit a branch
:param idt_branch: the id of the branch to edit
:return: redirection url
"""
check_admin()
add_branch = False
branch = TBranch.query.get_or_404(idt_branch)
print(branch)
# form = BranchForm(obj=branch)
AddBranchForm = add_branch_form_factory(default_company=branch.t_company_idt_company, default_bankaccount=branch.idt_bankaccount)
form = AddBranchForm()
if form.validate_on_submit():
branch.t_company_idt_company = form.company.data.idt_company
branch.shortname = form.shortname.data
branch.name = form.name.data
branch.mail = form.mail.data
branch.idt_bankaccount = form.bankaccount.data.idt_bankaccount
db.session.commit()
flash('Schulzweig erfolgreich geändert!')
# redirect to the departments page
return redirect(url_for('admin.list_branches'))
form.company.data = branch.t_company.longname
form.shortname.data = branch.shortname
form.name.data = branch.name
form.mail.data = branch.mail
form.bankaccount.data = branch.idt_bankaccount
return render_template('admin/branches/branch.html', action="Edit",add_branch=add_branch,
branch=branch,
form=form, title="Schulzweig bearbeiten")
最后 html
<td>
<a href="{{ url_for('admin.edit_branch', idt_branch=branch.idt_branch) }}">
<i class="fa fa-pencil"></i> Bearbeiten
</a>
</td>
将银行帐户和公司对象传递给表单解决了问题。感谢安东尼奥 link 的提示!
这是代码(edit_branch):
branch = TBranch.query.get_or_404(idt_branch)
bankaccount = TBankaccount.query.filter(TBankaccount.idt_bankaccount == branch.idt_bankaccount).one_or_none()
company = TCompany.query.filter(TCompany.idt_company == branch.t_company_idt_company).one_or_none()
form = BranchForm(obj=branch, company=company, bankaccount=bankaccount)
我需要在 QuerySelectField 中设置默认值。如果表单为空(添加对象)- 设置默认值可以正常工作。但是如果表单在(编辑一个对象)之前被初始化,我不知道如何设置默认值。 我已经尝试过这里建议的 formfactory:enter link description here
...不起作用...
我们有公司、(公司的)分支机构和银行账户。 每个分支机构都属于一家公司,并有自己的银行账户。 如果我编辑分支机构,则必须在 dropdwon 中将适当的公司和银行帐户设置为默认值。 所以我现在尝试处理这两天... - 我的错误在哪里?请帮忙!
C.
以下是片段:
模特:
class TBranch(db.Model):
__tablename__ = 't_branch'
idt_branch = db.Column(db.Integer, primary_key=True, info='ID of the branch')
t_company_idt_company = db.Column(db.ForeignKey('t_company.idt_company'), nullable=False, index=True,
info='id of the company')
shortname = db.Column(db.String(10), nullable=False, unique=True)
name = db.Column(db.String(45), nullable=False, info='Bankverbindung - taken from t_kto')
mail = db.Column(db.String(45), nullable=False, info='mailadress of the branch')
idt_bankaccount = db.Column(db.ForeignKey('t_bankaccount.idt_bankaccount'), nullable=False, index=True)
t_bankaccount = db.relationship('TBankaccount',
primaryjoin='TBranch.idt_bankaccount == TBankaccount.idt_bankaccount',
backref='t_branches')
t_company = db.relationship('TCompany', primaryjoin='TBranch.t_company_idt_company == TCompany.idt_company',
backref='t_branches')
class TCompany(db.Model):
__tablename__ = 't_company'
idt_company = db.Column(db.Integer, primary_key=True, info='ID of the company')
company = db.Column(db.String(45), nullable=False, info='company - xxxxx')
longname = db.Column(db.String(45), nullable=False,
info='Name of the company (xxxx)')
street = db.Column(db.String(50), nullable=False, info='Strasse')
plz = db.Column(db.String(10), nullable=False, info='plz of the company')
city = db.Column(db.String(45), nullable=False, info='City of the company')
phone = db.Column(db.String(45), nullable=False, info='Telephone number of the Company')
fax = db.Column(db.String(45), nullable=False, info='Fax number of the company')
web = db.Column(db.String(45), nullable=False, info='Webadress of the company')
taxid = db.Column(db.String(45), nullable=False, info='Steuernmmer')
firmenbuch = db.Column(db.String(45), info='Firmenbuchnummer')
gericht = db.Column(db.String(45), info='Gerichtsstand')
class TBankaccount(db.Model):
__tablename__ = 't_bankaccount'
idt_bankaccount = db.Column(db.Integer, primary_key=True, info='ID of the bankaccount dataset')
name = db.Column(db.String(45), nullable=False, info='Name of the bankaccount')
iban = db.Column(db.String(50), nullable=False, info='iban of the bankaccount')
bic = db.Column(db.String(50), nullable=False, info='bic of the bankaccount')
表单 - 如果没有传递任何对象,则设置默认值有效
class BranchForm(FlaskForm):
"""
Form for admin to add or edit the branches (Schulzweig)
"""
company = QuerySelectField(query_factory=lambda: TCompany.query.all(),
get_pk=lambda a: a.idt_company,
# default=lambda: TCompany.query.filter(TCompany.idt_company == 2).one_or_none(),
get_label=lambda a: a.longname)
shortname = StringField('Shortname', validators=[DataRequired()])
name = StringField('Name', validators=[DataRequired()])
mail = StringField('Mail', validators=[DataRequired()])
bankaccount = QuerySelectField(query_factory=lambda: TBankaccount.query.all(),
# default=lambda: TBankaccount.query.filter(TBankaccount.name == "xxx").one_or_none(),
get_label="name")
submit = SubmitField('Speichern')
Formfactory(设置默认不起作用...)
def add_branch_form_factory(default_company, default_bankaccount):
print("addbranch, company: " + str(default_company))
print("addbranch, bankaccount: " + str(default_bankaccount))
class AddBranchForm(FlaskForm):
"""
Form for admin to add or edit the branches (Schulzweig)
"""
company = QuerySelectField(query_factory=lambda: TCompany.query.all(),
#get_pk=lambda c: c.idt_company,
default=TCompany.query.filter_by(idt_company=default_company).one_or_none(),
get_label="longname")
shortname = StringField('Shortname', validators=[DataRequired()])
name = StringField('Name', validators=[DataRequired()])
mail = StringField('Mail', validators=[DataRequired()])
bankaccount = QuerySelectField(query_factory=lambda: TBankaccount.query.all(),
# get_pk=lambda b: b.idt_bankaccount,
default=TBankaccount.query.filter(
TBankaccount.idt_bankaccount == default_bankaccount).one_or_none(),
get_label=lambda b: b.name)
submit = SubmitField('Speichern')
景色
@admin.route('/branches/edit/<int:idt_branch>', methods=['GET', 'POST'])
@login_required
def edit_branch(idt_branch):
"""
Edit a branch
:param idt_branch: the id of the branch to edit
:return: redirection url
"""
check_admin()
add_branch = False
branch = TBranch.query.get_or_404(idt_branch)
print(branch)
# form = BranchForm(obj=branch)
AddBranchForm = add_branch_form_factory(default_company=branch.t_company_idt_company, default_bankaccount=branch.idt_bankaccount)
form = AddBranchForm()
if form.validate_on_submit():
branch.t_company_idt_company = form.company.data.idt_company
branch.shortname = form.shortname.data
branch.name = form.name.data
branch.mail = form.mail.data
branch.idt_bankaccount = form.bankaccount.data.idt_bankaccount
db.session.commit()
flash('Schulzweig erfolgreich geändert!')
# redirect to the departments page
return redirect(url_for('admin.list_branches'))
form.company.data = branch.t_company.longname
form.shortname.data = branch.shortname
form.name.data = branch.name
form.mail.data = branch.mail
form.bankaccount.data = branch.idt_bankaccount
return render_template('admin/branches/branch.html', action="Edit",add_branch=add_branch,
branch=branch,
form=form, title="Schulzweig bearbeiten")
最后 html
<td>
<a href="{{ url_for('admin.edit_branch', idt_branch=branch.idt_branch) }}">
<i class="fa fa-pencil"></i> Bearbeiten
</a>
</td>
将银行帐户和公司对象传递给表单解决了问题。感谢安东尼奥 link 的提示!
这是代码(edit_branch):
branch = TBranch.query.get_or_404(idt_branch)
bankaccount = TBankaccount.query.filter(TBankaccount.idt_bankaccount == branch.idt_bankaccount).one_or_none()
company = TCompany.query.filter(TCompany.idt_company == branch.t_company_idt_company).one_or_none()
form = BranchForm(obj=branch, company=company, bankaccount=bankaccount)