如何在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>
问题原因及解决说明
- 直接返回render的问题:原代码在
get_queryset中直接返回render,会跳过get_context_data的执行流程,导致模板依赖的grondstof_options等变量缺失,即使循环字符串也无法正常渲染输入字段。改为将数量存入session,让视图完整执行上下文构建逻辑,保证所有必要变量传递到模板。 - 字符串循环的不规范:原代码生成的是拼接字符串(如输入3得到"123"),Django模板会遍历每个字符,但当数量为两位数时(如10),会被拆分为'1'和'0'两个字符,导致生成错误的输入字段。改用数字列表
range(1, count+1)更直观且避免此类问题。 - 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
相关产品推荐
相关产品推荐

