Obiekt, który przekazuję z widoku do szablonu ma kilka pól, które są dynamicznie zwiększane i alokowane

Np. obiekt wygląda następująco:

row = {
 'id':id,
 'input.object1':obj1
 'input.object2':obj2
}

Próbuję uzyskać dostęp do wartości „input.object1” jako „{{row.input.object1}}” w szablonie. ale strona nie pokazuje niczego dla tego pola (ten sam problem dla „input.object2”. Ale „row.id” działa dobrze)

{% for row in row_list %}
    <tr>
        <td>{{ row.id }}</td>
        <td>{{ row.input.object1 }}</td>
        <td>{{ row.input.object2 }}</td>
    </tr>
{% endfor %}

Czy jest w ogóle dostęp do tych wartości w html? Z góry dziękuję :)

0
Umair 23 marzec 2020, 10:34

2 odpowiedzi

Najlepsza odpowiedź

Możesz wypróbować następującą strukturę swojego kontekstu:

row = {
 'id': id,
 'input': {'object1': obj1, 'object2': obj2}
}

Co pozwoli ci uzyskać dostęp do wartości w sposób, w jaki wypróbujesz to w swoim szablonie. Ale jeśli ta struktura jest dynamiczna i ma zmienną długość, lepiej jest użyć listy:

row = {
 'id': id,
 'input': [obj for obj in ....]
}

I w szablonie

{% for row in row_list %}
    <tr>
        <td>{{ row.id }}</td>
        {% for obj in row.input %}
            <td>{{ obj }}</td>
        {% endfor %}
    </tr>
{% endfor %}
2
schwobaseggl 23 marzec 2020, 07:39

Języki szablonów Django używają kropek w nazwach zmiennych, aby wskazać indeks (listy itp.), Klucz (dict-polubienia) lub atrybut (cokolwiek innego), więc dla {{ row.input.object1 }} najpierw próbuje rozwiązać row.input jako albo row["input"] lub row.input - żadne z nich nie istnieje.

Chcesz utworzyć input listę lub dyktando, tj .:

row = {
 'id':id,
 'input'= [obj1, obj2]
}

I wtedy

{{ row.input.0 }} - {{ row.input.1 }}

Lub

row = {
   'id':id,
   'input'= {"object1": obj1, "object2": obj2}
 }

I wtedy

{{ row.input.object1 }} - {{ row.input.object2 }}
1
bruno desthuilliers 23 marzec 2020, 07:42