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
相关产品推荐
相关产品推荐

