Пользовательский тег для установки переменной в шаблоне Django. Вырывание значения из контекста?

#django #variables #django-templates #custom-tag

Вопрос:

В моем шаблоне Django я хочу установить переменную для использования в html-теге. Но когда я выхожу из цикла for, переменная пуста 🙁

 {% load custom_template_tag %}

<select>
    <option value=""></option>
    {% for a_status in status %}
        {% for r in all_status_ressources %}
            {% if a_ressource.id == r.0 and a_status.name == r.1 %}
                {% setvar "selected" as selected_status %}
                id ressource : {{ r.0 }}, name status : {{ r.1 }} -> [{{ selected_status }}]<br>
            {% endif %}
                selected_status : "{{ selected_status }}"
        {% endfor %}
        end loop ---------> selected_status : "{{ selected_status }}"
        <option value="{{ a_status.id }}" selected="{{ selected_status }}">{{ a_status.name }}</option>
    {% endfor %}
</select>
 

Сам пользовательский тег :

 from django import template

register = template.Library()


@register.simple_tag
def setvar(val=None):
    return val

 

И, теперь отладочная трассировка :

 selected_status : ""

id ressource : 2, name status : "my personnal status" -> [selected]

selected_status : "selected"
selected_status : "selected"
selected_status : "selected"
selected_status : "selected"
selected_status : "selected"
selected_status : "selected"
selected_status : "selected"
selected_status : "selected"
selected_status : "selected"
selected_status : "selected"
selected_status : "selected"
selected_status : "selected"
selected_status : "selected"
selected_status : "selected"

end loop ---------> selected_status : ""

 

Поэтому, когда я выхожу из цикла for, переменная не настроена для использования в html-теге.

У вас есть идея, пожалуйста ?

Большое спасибо Ф.

Комментарии:

1. Почему вы пишете свой собственный тег для этого, почему бы его не использовать {% with <var>=<val> %} ?

2. Как я могу поступить с «с» ?. Он находится в блоке, и в моем коде есть алеардные блоки, такие как «цикл», «если» и т. Д.

3. Вы сталкиваетесь с этой проблемой, потому что вы не передаете данные в надлежащем формате в свой шаблон из своего представления. Ваше представление должно предоставлять ваши данные таким образом, чтобы шаблон мог легко их отображать.

4. @AbdulAzizBarkat : Я согласен 🙁

Ответ №1:

Вы можете использовать встроенный {% with <var>=<val> %} тег:

Что-то вроде:

template.html

 <select>
  <option value=""></option>
  {% for a_status in status %}
    {% for r in all_status_ressources %}
      {% if a_ressource.id == r.0 and a_status.name == r.1 %}
        {% with selected_status="selected" %}
          id ressource : {{ r.0 }}, name status : {{ r.1 }} -> [{{selected_status }}]<br>
        {% endwith %}
      {% endif %}
      selected_status : "{{ selected_status }}"
    {% endfor %}
    end loop ---------> selected_status : "{{ selected_status }}"
    <option value="{{ a_status.id }}" selected="{{ selected_status }}">{{a_status.name }}</option>
  {% endfor %}
</select>
 

Комментарии:

1. Таким образом, после тега {% endwith %} переменная не задана. В моем примере я не могу вернуть значение 🙁

2. Но на данный момент в моем первом сообщении я не понимаю, почему значение после цикла пустое. Есть какие-нибудь идеи, пожалуйста ?. Спасибо

3. Скорее всего, это не ошибка кодирования, а логическая ошибка. Какое значение должно selected_status быть за пределами оператора if?