Установить значение по умолчанию в QuerySelectField (форма инициализируется объектом)

Мне нужно установить значение по умолчанию в 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>

person cojody    schedule 17.06.2021    source источник
comment
В чем именно проблема? Есть ли у вас какие-либо ошибки при запуске этого кода или значение по умолчанию просто не отображается? Кроме того, вы проверили это - stackoverflow.com/questions/21579373/ ? кажется, очень похоже на ваш вопрос   -  person Antonio Margaretti    schedule 17.06.2021
comment
@AntonioMargaretti Спасибо за ответ! При выполнении этого кода ошибок нет. Но значение по умолчанию не отображается в раскрывающемся списке. Dropdwons заполняются компаниями/банковскими счетами, но активными записями в раскрывающихся списках являются первые записи из списка компаний/банковских счетов, а не значения, присвоенные редактируемой ветке. Я пытаюсь решить вашу ссылку - пока безуспешно...   -  person cojody    schedule 18.06.2021


Ответы (1)


Перенос банковского счета и объектов компании в форму решил проблему. Спасибо Антонио за ссылку с подсказкой!

Вот код (для 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)
person cojody    schedule 18.06.2021