0

我有 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

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

我知道可以计算后端等中的值,但是region当用户选择该字段时,是否可以几乎“实时”完成该zipcode字段?在某种程度上它也可以在用户的​​表单中看到?

谢谢!

4

1 回答 1

0

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

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

视图.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() 方法,该方法也会从邮政编码中查找区域。如果它与前端表单发布的区域不匹配,它将返回错误消息。

表格.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 

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

于 2012-06-24T17:08:45.000 回答