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

Django表单嵌套IF语句第二个条件失效问题求助

解决Django表单嵌套验证配送邮编失效的问题

嘿,我一眼就揪出问题所在了!这是个典型的大小写不匹配导致的验证失效,咱们来一步步拆解清楚:

问题根源

你在清理字段时把用户输入的邮编统一转成了全小写:

pcode = self.cleaned_data['pcode'].lower()

但你的配送许可集合permitted里的邮编是混合大小写的(比如'GF34'、'BT25')。当执行pcode[:4] in permitted判断时,小写的字符串(比如'gf34')根本匹配不上集合里的大写条目,所以这个条件永远会触发错误——哪怕用户输入的是符合配送范围的邮编,也会被误判。

而你提到单独验证第二个条件时功能正常,应该是因为单独测试时没有统一转小写,输入的大小写和集合里的一致,所以能匹配成功。

修正方案

有两种简单的解决办法,任选其一即可:

方案1:将许可集合统一为小写

和处理后的用户输入保持大小写一致:

from django import forms
import requests

class PostCodeForm(forms.Form):
    pcode = forms.CharField()

    def clean_pcode(self):
        pcode = self.cleaned_data['pcode'].lower()
        # 将许可邮编统一为小写,匹配处理后的输入格式
        permitted = {'gu15','gf34','fg34','bt25'}
        url = 'https://api.postcodes.io/postcodes/{}/validate'.format(pcode)
        r = requests.get(url)
        is_correct = r.json()['result']
        
        if not is_correct:
            raise forms.ValidationError("Your postcode is invalid. Please re-enter a valid entry.")
        
        if not pcode[:4] in permitted:
            # 修正错误消息里的语法问题
            raise forms.ValidationError("Apologies, but we do not currently deliver to your postcode.")
        
        return pcode

方案2:判断时将邮编前缀转成大写

如果想保留许可集合的大写格式,可以在判断时转换输入的大小写:

# ... 其他代码不变
permitted = {'GU15','GF34','FG34','BT25'}
# ...
if not pcode[:4].upper() in permitted:
    raise forms.ValidationError("Apologies, but we do not currently deliver to your postcode.")

额外小优化

我还帮你修正了错误消息里的小语法问题:把does not改成了we do not,you postcode改成了your postcode,让提示更通顺专业。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:28:46