如何在Django模板中正确渲染选择字段?
修正后的代码及说明
1. 模型(修正缩进问题)
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)
2. 视图(修正过滤逻辑与上下文传递)
# 实现参数有效性判断函数 def is_valid_queryparam(param): return param is not None and param != '' def staff_filter(request): qs = Consumer.objects.all() size = request.GET.get('size') # 保留你的其他查询逻辑... if is_valid_queryparam(size) and size != 'Choose...': # 直接用GET参数值过滤,与模型存储的键(S/M/L)匹配 qs = qs.filter(size=size) return qs def filter(request): qs = staff_filter(request) context = { 'queryset': qs, # 直接传递模型的尺寸选项到模板 'size_choices': Consumer.SIZES } return render(request, 'filter.html', context)
3. 模板(修正下拉框渲染逻辑)
<div class="form-group col-md-4"> <label for="size">size</label> <select id="size" class="form-control" name="size"> <option>Choose...</option> {% for value, label in size_choices %} <option value="{{ value }}" {% if request.GET.size == value %}selected{% endif %}>{{ label }}</option> {% endfor %} </select> </div>
关键修正点
- 模型:修正
SIZES的缩进,确保它属于Consumer类的内部属性。 - 视图:
- 过滤逻辑直接使用
request.GET获取的尺寸键(S/M/L),无需调用实例方法get_size_display()(该方法用于实例的友好名称展示,不适合过滤)。 - 上下文传递模型的
SIZES选项集合,而非所有Consumer实例,更高效且符合需求。 - 修正模型类名大小写错误(
consumer改为Consumer)。
- 过滤逻辑直接使用
- 模板:
- 循环遍历尺寸选项的键值对,用
value作为表单提交值,label作为用户可见文本。 - 添加选中状态判断,确保过滤后下拉框保持当前选中值,提升交互体验。
- 循环遍历尺寸选项的键值对,用
内容的提问来源于stack exchange,提问作者trans
相关产品推荐
相关产品推荐

