Мне нужно установить значение по умолчанию в QuerySelectField. Если Форма пуста (добавить объект) - установка значения по умолчанию работает нормально. Но если форма инициализируется до (редактировать объект), я понятия не имею, как установить значение по умолчанию. Я уже пробовал предложенный здесь формфактор: введите здесь описание ссылки
... не работает...
У нас есть компании, филиалы (компаний) и банковские счета. Каждый филиал принадлежит компании и имеет свой банковский счет. Если я редактирую ветку, соответствующая компания и банковский счет должны быть установлены по умолчанию в файле 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')
Формфактор (установка по умолчанию не работает...)
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>