You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:15:17