LINUX.ORG.RU

Flask обновить объект в форме

 ,


0

1

Привет.

Есть форма запроса, в ней есть поля, которые она забирает из ldap. Например, список общих почтовых ящиков (mail_boxes), к которым пользователь должен получить доступ. Но если я в ldap добавляю новый ящик, который должен отображаться в форме, то он появляется только если перезапустить приложение.

Те есть класс UserForm и его переменные не обновляются при запросе. Как бы их насильно обновлять?

models.py

class UserForm(FlaskForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)


    mail_boxes = Select2MultipleField(u"Zugriff auf Mailkonto", [],
            choices=get_mail_boxes(),
            description=u"X2",
            render_kw={"multiple": "multiple"})



#views.py




@request_new_user.route('/', methods= ["GET", "POST"])
@roles_accepted('control_admin', 'control_create_user')
@login_required
def request_form():
    
    form = UserForm()

    if form.validate_on_submit(): 
        form_data = {}
        for key in request.form.keys():
            values = request.form.getlist(key)
            if len(values) == 1:
                form_data[key] = values[0]
            else:
                form_data[key] = values

        form_data = format_form_data(form_data)
        return render_template('result.html', form_data=form_data)
    return render_template('form.html', form=form , title='Anforderung zum Anlegen eines neuen Benutzers' )

#form.html






                                {{ form.mail_boxes.label }}
                                {{ form.mail_boxes(class_="form-control") }}      
...

                          

                            <script type="text/javascript">document.addEventListener("DOMContentLoaded", function () {
                                $("#mail_boxes").select2();
                            });

#models.py

def get_mail_boxes():

    search_base = 'cn=users,dc=xxx,dc=com'
    search_filter = '(&(uid=mail_*))'
    attr = ['mailPrimaryAddress', 'uid']
    conn = get_bound_connection()
    conn.search(search_base, search_filter, attributes=attr)
    if len(conn.entries) < 1:
        return False

    result = []
    for item in conn.entries:
        mail = getattr(item, 'mailPrimaryAddress', False)[0]
        uid = getattr(item, 'uid', False)[0]
        result.append(tuple((uid, mail)))
    return result


★★★

Ответ на: комментарий от gruy

Потому что так функция получения ящиков вызывается только один раз при первом определении класса.

Это мне понятно. Просто я в ООП пока что буратино. Как мне ее вызывать при каждом обращении?

Я пробую обернуть все эти переменные внутри класса в функцию и при запускать эту функцию при def init(self):, но что-то не то делаю.

constin ★★★ ()
Последнее исправление: constin (всего исправлений: 1)
Ответ на: комментарий от gruy

В общем , оказалось легко, надо просто засунуть переменную после объявления инстанса

В классе

class UserForm(FlaskForm):

    mail_boxes = Select2MultipleField(u"Zugriff auf Mailkonto", [],
            coerce=int,
            description=u"X2",
            render_kw={"multiple": "multiple"})

coerce=int означает, что запихнуть данные попозже

и во вьюхе


@request_new_user.route('/', methods= ["GET", "POST"])
@roles_accepted('control_admin', 'control_create_user')
@login_required
def request_form():
    # if not current_user.is_authenticated:
    #     return redirect(url_for('user.login'))

    #  сначала объявляем
    form = UserForm()


    #  а теперь запихиваем данные
    form.mail_boxes.choices = get_mail_boxes()


constin ★★★ ()