Невозможно сделать переменную фляги python видимой для другого блока if в файле шаблона html, так как область действия оператора with заканчивается на блок if - PullRequest
0 голосов
/ 18 июня 2019

Python Flask: Невозможно сделать переменную фляги Python видимой для другого блока if в файле шаблона html, поскольку область действия оператора with заканчивается на блок if.Пытался разместить блок if над циклом for, но он не выполняется.

Список ключ: значение имеет что-то вроде этого: "{subject: Maths, UnitTest1-Score: 90, UnitTest2-Score: 95, UnitTest2-Score: 98}" Хотел бы передать переменную subject_name во вторуюоператор if "if key == 'UnitTest3'" заинтересован в том, чтобы ссылаться на соответствующую тему, а затем обновлять отметки в базе данных.Поскольку переменная определена (с помощью оператора «with») в первом операторе if «if key == 'Subject'%}. Попробовано по-разному, однако контекст не перемещается вперед после первого блока if. Попытался добавить« with »subject_name = '' "после 4-й строки" if key ", так что он может быть виден через секунду, если" if key == 'Subject' ", однако это выдает ошибку, что subject_name не определено, если используется во второй if, если" if key == 'Субъект '' Я считаю, что jinja2 поддерживает это. Любая помощь приветствуется.

{% block content %}
{% for i in all_subjects %}
<article>
{%for key, value in i.items() %}
    {% if key %}    
        {% if key == 'Subject' %}

            {% with subject_name = value %}

            {% with subject = subject_db.find_one({'subject_name': subject_name}) %}
            {% if subject %}

                <div>
                    <a  href="#" >{{subject['subject_name']}}</a>
                </div>

            {% endif %}
            {% endwith %}
            {% endwith %}

        {% endif %}
        {% if key == 'UnitTest3' %}
            {% with marks = value  %}
            <form  action="" method='POST'>
                <div>
                    <label>  Marks: <input type="number" name="total_marks" min="0" value=0 oninput="this.value = Math.abs(this.value)"> </label>
                    <button type="submit">Update</button>

                </div>
            </form>
            {% endwith %}

        {% endif %}

    {% endif %}
{% endfor %}
</article>
{% endfor %}  
{% endblock content %}

1 Ответ

0 голосов
/ 19 июня 2019

Вы пытаетесь делать вещи в Jinja, которые намного лучше подходят для Python. Кроме того, вы, кажется, переходите в один словарь с двумя различными типами объектов. Это сбивает с толку и не нужно.

Вы должны полностью обработать и подготовить ваши данные на python, а затем передать соответствующие объекты / словари в Jinja для отображения. Хорошее практическое правило заключается в том, что вы должны избегать вызовов базы данных из Jinja. Позаботьтесь об этом в методе просмотра Flask.

Я бы также отметил, что пары key / value выйдут из i в непредсказуемом порядке. И что у вас не может быть элемента словаря с None в качестве значения ключа, поэтому проверку {% if key %} можно удалить.

Как только вы правильно структурируете свои данные, вы сможете сделать что-то вроде этого:

render_template('subjects.html', subjects=all_subjects, marks=all_marks)
{% block content %}
{% for s in subjects %}
    <article>
        <div class="subject">
            <a  href="#" >{{ subject.name }}</a>
        </div>
    </article>
{% endfor %}
{% for m in marks %}
    <article>
        <div>
            <form  action="" method='POST'>
                <label for="total_marks">Marks</label>
                <input type="number" id="total_marks" min="0" value="{{ m.value }}" oninput="this.value = Math.abs(this.value)">
                <button type="submit">Update</button>
            </form>
        </div>
    </article>
{% endfor %}
{% endblock content %}

Последнее: « unit test » имеет особое значение в программном обеспечении, и вам следует избегать использования этого термина для обозначения чего-либо еще, поскольку это добавит путаницу для следующего человека, который унаследует ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...