【问题标题】:django forms - validate or autofill field based on value other fielddjango forms - 根据值其他字段验证或自动填充字段
【发布时间】:2026-01-28 15:20:02
【问题描述】:

我有 3 个用外键链接的模型:

class Region(models.Model):
    name = models.CharField(max_length=20)

class Zipcode(models.Model):
    zipcode =  models.IntegerField()
    name = models.CharField(max_length=20)
    region = models.ForeignKey(Region)

class Address(models.Model):
    street = models.Charfield(max_length=40)
    zipcode = models.ForeignKey(Zipcode)
    region = models.ForeignKey(Region)

在下一步中,我根据模型 Address 制作了一个表单。

现在我想在用户填写zipcode字段时自动填写region字段。

我知道可以计算后端等中的值,但是当用户选择zipcode 字段时,是否可以几乎“实时”完成region 字段?以某种方式在用户的表单中也可见?

谢谢!

【问题讨论】:

    标签: django django-models django-forms foreign-keys


    【解决方案1】:

    我认为您会需要某种 ajax 查找。例如,每当有人输入邮政编码时,javascript(我建议使用 jquery)将被设置为执行 ajax 请求。或许如果邮政编码文本框长度为 6,那么 onChange 事件将请求 URL“/ajax/get_region/60604/”,该 URL 将映射到下面的视图并传入邮政编码。该视图可能会返回一个 json 响应,该响应将指示该邮政编码的区域。最后,在 javascript 回调函数中可以更新您网站上的对话框以指示区域。

    我的建议是,甚至不需要将该区域发布回网络服务器......这里的 ajax 查找仅用于显示目的,然后在 POST 期间再次计算。但是,话又说回来,我不知道您是否希望用户能够手动输入区域和邮政编码。

    views.py

    import json
    from django.http import HttpResponse
    
    def ajax_region_from_zip(request, zip):
    
        # do your logic to lookup the zipcode from the region
        region, lookup_success = get_region_form_zip(zip)        
    
        response = Response(content_type='application/json')
        response.write(json.dumps({"success":lookup_success, "region":region ))
        return response 
    

    最后,如果您确实希望用户能够在表单中编辑区域和邮政编码,您需要确保区域和邮政编码始终保持一致,您可能希望在用户提交的表单中构建检查。此外,如果用户禁用了 javascript,如果用户选择了错误的区域,您将需要向用户提供错误信息。您可以覆盖表单上的 clean() 方法,该方法也会从邮政编码中查找区域。如果它与前端表单发布的区域不匹配,它将返回错误消息。

    forms.py

    class AddressForm(forms.ModelForm):
        ....
        ....
        def clean(self):
            cleaned_data = self.cleaned_data
            zip = cleaned_data.get('zip', None)
            region = cleaned_data.get('region', None)
            region_lookup, lookup_success = get_region_form_zip(zip)
            if not region == region_lookup:
                forms.ValidationError("This zipcode is not in the given region.")
            return cleaned_data 
    

    请注意,这些代码示例尚未经过测试,但希望能够理解。
    希望对你有帮助,

    【讨论】:

    • 感谢乔的反馈!我会试试这个建议。问候。