django表单 - 基于其他字段值验证或自动填充字段

时间:2012-06-24 15:56:20

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

我有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字段?在某种程度上,它也可以在用户的​​表单中看到?

谢谢!

1 个答案:

答案 0 :(得分:0)

我想你会想要某种ajax查找。例如,每当有人输入邮政编码时,javascript(我建议使用jquery)就会设置为执行ajax请求。也许如果zipcode文本框长度为6,那么onChange事件将请求url“/ ajax / get_region / 60604 /”,它将映射到下面的视图并传入zipcode。该视图可能会返回一个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 

请注意,这些代码示例尚未经过测试,但希望能够实现这一点 希望这会有所帮助,