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

如何在Django模板中使用变量迭代生成输入字段?

问题描述

使用Python和Django开发时,希望根据输入框中输入的数值,在模板里迭代生成对应数量的输入字段。目前在视图中根据输入数值生成字符串volgordelijst并传递给模板,但使用该变量循环时无法显示输入字段,替换为硬编码字符串"12345"则可正常运行。

获取迭代数值的表单代码

<form method="GET">
    <label for="grondstoffen_count" style="font-family: Oswald, sans-serif;">请输入到货产品数量:</label>
    <input type="number" name="grondstoffen_count" id="grondstoffen_count" min="0" required>
    <button type="submit" name="submit_count">确认</button>
</form>

视图views.py相关代码

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

        # 从session获取数量并生成数字列表
        grondstoffen_count = self.request.session.get('grondstoffen_count', 0)
        if grondstoffen_count > 0:
            context['volgordelijst'] = range(1, grondstoffen_count + 1)
        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("跳转到订单页面")
        elif 'submit_count' in self.request.GET:
            grondstoffen_count = int(self.request.GET.get('grondstoffen_count', 0))
            # 将数量存入session,避免直接返回render跳过上下文处理
            self.request.session['grondstoffen_count'] = grondstoffen_count
        
        # 返回默认查询集
        return super().get_queryset()

迭代生成输入字段的模板代码

<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;">原材料 {{ i }} 名称:</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;">原材料 {{ i }} 数量(吨):</h4>
            <input type='number' step="0.01" name='{{ key }}' value='{{ request.GET|get:key }}' min="0" required>
        </div>
        <br>
        {% endwith %}
    {% endfor %}
</form>

问题原因及解决说明

  1. 直接返回render的问题:原代码在get_queryset中直接返回render,会跳过get_context_data的执行流程,导致模板依赖的grondstof_options等变量缺失,即使循环字符串也无法正常渲染输入字段。改为将数量存入session,让视图完整执行上下文构建逻辑,保证所有必要变量传递到模板。
  2. 字符串循环的不规范:原代码生成的是拼接字符串(如输入3得到"123"),Django模板会遍历每个字符,但当数量为两位数时(如10),会被拆分为'1'和'0'两个字符,导致生成错误的输入字段。改用数字列表range(1, count+1)更直观且避免此类问题。
  3. request.GET取值问题:原模板中value='{{ request.GET.key }}'无法正确获取对应参数,需改为value='{{ request.GET|get:key }}',同时需要在app的templatetags目录下自定义get过滤器实现字典取值:
    from django import template
    register = template.Library()
    
    @register.filter(name='get')
    def get(dictionary, key):
        return dictionary.get(key, '')
    

内容的提问来源于stack exchange,提问作者Greg Degoeiegast

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:03:10