Как использовать переменную для итерации в шаблоне django?
Я использую python и django и хотел бы использовать переменную, которую я ввел в предыдущем поле ввода, для итерации при создании нескольких других полей ввода.
Это часть шаблона Django, где я спрашиваю число, которое я хочу использовать в итерации:
<form method="GET">
<label for="grondstoffen_count" style="font-family: Oswald, sans-serif;">Give how many products were delivered:</label>
<input type="number" name="grondstoffen_count" id="grondstoffen_count" min="0" required>
<button type="submit" name="submit_count">Bevestig</button>
</form>
Это часть моего views.py, где я генерирую строку последовательности до входного номера. Когда у меня есть строка, я возвращаю ее в шаблон Django:
class BehandelNieuweVoorraadView(generic.ListView):
template_name = "Ano_app/BehandelNieuweVoorraad.html"
model = Grondstof
checkaankomst = []
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['grondstof_options'] = self.optieLijst(1)
if self.checkaankomst == []:
context['aankomstgrondstoffen'] = self.optieLijst(2)
self.checkaankomst.extend(context['aankomstgrondstoffen'])
else:
context['aankomstgrondstoffen'] = self.checkaankomst
return context
def optieLijst(self, a):
grondstof_options = Grondstof.objects.distinct().values_list('naam', flat=True)
if a == 1:
return sorted(grondstof_options)
else:
aankomstgrondstoffen = random.sample(list(grondstof_options), random.randint(2, 5))
return sorted(aankomstgrondstoffen)
def get_queryset(self):
if 'submit_hoeveelheden' in self.request.GET:
grondstofnamen = []
for i in range(1, 6):
grondstofnaam = self.request.GET.get(f"query_grondstof{i}naam", False)
grondstofnamen.append(grondstofnaam)
grondstofhoeveelheden = []
for i in range(1, 6):
grondstofhoeveelheid = self.request.GET.get(f"query_grondstof{i}hoeveelheid", False)
if grondstofhoeveelheid == '':
grondstofhoeveelheden.append(0.0)
else:
grondstofhoeveelheden.append(float(grondstofhoeveelheid))
nietOpgeslagen = verdeelAangekomenGrondstoffen(grondstofnamen, grondstofhoeveelheden, Opslagplaats.objects.all(), Grondstof.objects.all(), Eindproduct.objects.all())
elif 'submit_correctelevering' in self.request.GET:
print("naar orderpagina")
elif 'submit_count' in self.request.GET:
grondstoffen_count = int(self.request.GET.get('grondstoffen_count', 0))
volgordelijst = ""
for i in range(1, grondstoffen_count + 1):
volgordelijst += str(i)
return render(self.request, 'Ano_app/BehandelNieuweVoorraad.html', {'volgordelijst': volgordelijst})
В шаблоне я получаю 'volgordelijst' (так что я не думаю, что это проблема с передачей переменной из представления в шаблон, потому что имя предлагается автоматически), и я хотел бы использовать эту переменную для цикла. Я хотел бы иметь столько полей ввода, сколько их было в исходном вводе, но когда я запускаю сервер, он не показывает ни одного. Когда я меняю 'volgordelijst' на "12345", все работает отлично. У меня также есть другие списки, которые я передаю в шаблон, и там у меня нет никаких проблем с итерацией:
<form method='GET'>
{% for i in volgordelijst %}
{% with key="query_grondstof"|add:i|add:"hoeveelheid" %}
<div style="display: inline-block; margin-right: 10px;">
<h4 style="font-family: Oswald, sans-serif;">Grondstof {{ i }} naam:</h4>
<input list="grondstof{{ i }}datalist" name="query_grondstof{{ i }}naam" id="grondstof{{ i }}" required>
<datalist id="grondstof{{ i }}datalist">
{% for option in grondstof_options %}
<option value="{{ option }}">
{% endfor %}
</datalist>
</div>
<div style="display: inline-block; margin-right: 10px;">
<h4 style="font-family: Oswald, sans-serif;">Grondstof {{ i }} hoeveelheid in ton:</h4>
<input type='number' step="0.01" name='{{ key }}' value='{{ request.GET.key }}' min="0" required>
</div>
<br>
{% endwith %}
{% endfor %}
</form>
Теперь, когда вы опубликовали свой взгляд, я вижу проблему. Вы пытаетесь передать переменную volgordelijst
в шаблон из функции get_queryset
. Функция get_queryset
должна вернуть набор запросов в функцию get_context_data
. Чтобы передать переменную в шаблон, нужно передать ее из функции get_context_data
.