Отображение поля выбора в шаблоне Django
Я пытаюсь найти работоспособное решение для моей проблемы. Я уже нашел ответы на два похожих вопроса, но все равно не могу их решить. Если у нас есть класс, подобный этому:
from django.db import models
class Consumer(models.Model):
SIZES = (
('S', 'Small'),
('M', 'Medium'),
('L', 'Large'),
)
name = models.CharField(max_length=60)
size = models.CharField(max_length=2, choices=SIZES)
И я сделал в своем представлении и шаблоне вот так (Узнал из одного учебника)
***view with combined queries***
def staff_filter(request):
qs = Consumer.objects.all()
size= request.GET.get('size')
# I have some other queries in between ....
if is_valid_queryparam(size) and size!='Choose...':
qs = qs.filter(size=consumer.get_size.display())
return qs
def filter(request):
qs=staff_filter(request)
context={
'queryset':qs,
'consumer':consumer.objects.all()
}
return render(request, 'filter.html',context)
**template***
<div class="form-group col-md-4">
<label for="size">size</label>
<select id="size" class="form-control" name="size">
<option selected\>Choose...</option>
{% for size in consumer.get_size.display %}
<option value="{{ size }}">{{size}}</option>
{% endfor %}
</select>
</div>
Как мне исправить это? Спасибо!
Отображение поля выбора в шаблоне Django
Вы неправильно написали consumer
в контексте в просмотре
'consumer':consumer.objects.all() #You mispelled consumer here
Попробуйте это:
'consumer':Consumer.objects.all() # Consumer, first letter should be capital
Я думаю, что вы ошиблись в приведенном выше коде, поэтому вы не получаете значения в шаблоне
Вам не нужен никакой метод get_size.display() в шаблоне. Если переменная consumer является объектом класса Consumer, то вам просто нужно сделать вот так:
<select>
{% for val, text in consumer.SIZES %}
<!--
Here SIZES is a tuple variable of your Consumer class,
while consumer is an instance of the Consumer class then you can just
call SIZES tuple from any of its instances.
-->
<option value="{{ val }}">{{ text }}</option>
{% endfor %}
</select>
Если consumer - это переменная из контекста, который вы передаете в своем view, то это кверисет. Поэтому в этом случае вы должны сначала выполнить цикл по кверисету, а затем вызвать переменную SIZES из каждого объекта внутри цикла:
{% for object in consumer %}
<select>
{% for val, text in object.SIZES %}
<option value="{{ val }}">{{ text }}</option>
{% endfor %}
</select>
{% endfor %}