Отображение поля выбора в шаблоне 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 %}

Вернуться на верх