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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:05:59