Django模板if语句对比HTML输入与模型值时失效问题求助
问题:输入值与模型值匹配判断失效,仅执行else分支
我希望在results.html中判断页面输入的pH和湿度值与cropInfo模型中的数据是否匹配,匹配则显示对应作物信息,但目前代码只会执行else分支,输出"Sorry for your inconvience"。
相关代码
results.html
<div class="card-body bg-light"> <h5>Your data :</h5> <p>Your pH value: {{ ph }} pH. </p> <p>Your moisture value: {{ moist }}</p> <div style="color: white;"> {% for g in crop_data %} {% if ph == g.ph and moist == g.moisture %} <p>{{ g.name }}</p> <p>{{ g.ph }}</p> <p>{{ g.moisture }}</p> {% else %} <p>Sorry for your inconvience</p> {% endif %} {% endfor %} </div> </div>
models.py
from django.db import models class cropInfo(models.Model): name = models.CharField(max_length=100) moisture = models.IntegerField() ph = models.IntegerField() description = models.TextField() image = models.ImageField(upload_to='images/') def __str__(self): return self.name
views.py
def results(request): crop_data = cropInfo.objects.all() context = { 'crop_data':crop_data, } ph = request.POST.get('pH') moist = request.POST.get('moisture') print(ph) print(moist) return render(request, 'results.html', {'ph':ph, 'moist':moist, 'crop_data':crop_data})
index.html
<form method="post" id="form" action="{% url 'results' %}"> {% csrf_token %} <div class="row"> <div class="col-md-4"> <label id="text" for="pH">pH</label> <input id="label" type="number" id="pH" name="pH" placeholder="Enter pH value" class="form-control" required> </div> </div> <div class="row mt-4"> <div class="col-md-4"> <label id="text" for="moisture">Moisture</label> <input id="label" type="number" id="moisture" name="moisture" placeholder="Enter moisture level" class="form-control" required> </div> </div> <div class="row mt-4"> <div class="col-md-12 text-center"> <button type="submit" class="btn btn-primary btn-lg" style='float: left;' id="center" >Process</button> </div> </div> </form>
问题原因
核心是数据类型不匹配:
- 从
request.POST.get()获取的ph和moist是字符串类型 - 模型
cropInfo中的ph和moisture是IntegerField,存储的是整数类型
直接用==对比字符串和整数,结果永远为False,所以每次都会执行else分支。
另外,当前模板逻辑有缺陷:每循环一个作物就判断一次,只要当前作物不匹配就输出错误信息,会导致页面重复显示多次"Sorry for your inconvience"。
解决方案
1. 修正views.py中的类型转换
把获取到的表单值转换成整数,同时处理可能的转换异常:
def results(request): crop_data = cropInfo.objects.all() ph = None moist = None if request.method == 'POST': # 尝试转换为整数,处理转换失败的情况 try: ph = int(request.POST.get('pH')) moist = int(request.POST.get('moisture')) except (ValueError, TypeError): # 转换失败可设置默认值或返回错误提示 pass print(ph) print(moist) return render(request, 'results.html', {'ph':ph, 'moist':moist, 'crop_data':crop_data})
2. 优化results.html的模板逻辑
改为先遍历所有作物寻找匹配项,找不到再显示错误信息,避免重复输出:
<div class="card-body bg-light"> <h5>Your data :</h5> <p>Your pH value: {{ ph }} pH. </p> <p>Your moisture value: {{ moist }}</p> <div style="color: white;"> {% with found=False %} {% for g in crop_data %} {% if ph == g.ph and moist == g.moisture %} <p>{{ g.name }}</p> <p>{{ g.ph }}</p> <p>{{ g.moisture }}</p> {% with found=True %}{% endwith %} {% endif %} {% endfor %} {% if not found %} <p>Sorry for your inconvience</p> {% endif %} {% endwith %} </div> </div>
内容的提问来源于stack exchange,提问作者user075
相关产品推荐
相关产品推荐

