Django中django-phonenumber-field搜索:需将本国号码转E164格式
解决Django Admin中本国格式电话号码搜索E164存储数据的问题
你已经通过django-phonenumber-field成功将电话号码以E164格式存入数据库,但在Admin后台使用本国格式(如0216333007)搜索时无法匹配对应数据。可以通过重写ModelAdmin的get_search_results方法,自动将用户输入的本国号码转换为E164格式后再执行搜索。
修改步骤:
- 导入
PhoneNumber和PhoneNumberParseException模块,用于号码解析与格式转换 - 在
ExternalAdmin类中重写get_search_results方法,处理搜索关键词里的电话号码
修改后的admin.py代码示例:
from django.contrib import admin from phonenumber_field.phonenumber import PhoneNumber, PhoneNumberParseException from .models import External # 假设你已定义StatusFilter、TypeFilter、RegionFilter这些自定义过滤器 class ExternalAdmin(admin.ModelAdmin): exclude = () form = ExternalAdminForm list_per_page = 10 readonly_fields = ('created_at', 'updated_at') list_display = ('name', 'type_id_slug', 'short_address', 'region_id_slug', 'email_link', 'phone', 'status', 'created_at', 'updated_at') list_filter = (StatusFilter, TypeFilter, RegionFilter,) search_fields = ('name', 'address', 'email', 'phone',) def get_search_results(self, request, queryset, search_term): queryset, use_distinct = super().get_search_results(request, queryset, search_term) # 尝试解析搜索词为本国号码并转为E164格式,这里以印尼(地区码ID)为例,按需修改 try: phone_number = PhoneNumber.from_string(search_term, region='ID') e164_number = phone_number.as_e164 # 添加E164格式号码的搜索条件 queryset |= self.model.objects.filter(phone=e164_number) except PhoneNumberParseException: # 若输入不是有效号码,跳过转换,保留原有搜索逻辑 pass return queryset, use_distinct admin.site.register(External, ExternalAdmin)
代码说明:
PhoneNumber.from_string(search_term, region='ID'):指定对应国家/地区的代码,将用户输入的本国格式号码解析为标准PhoneNumber对象phone_number.as_e164:将解析后的号码转换为E164格式字符串(如+62216333007)- 异常处理:若用户输入的不是有效电话号码,会触发
PhoneNumberParseException,此时跳过转换逻辑,不影响其他字段的搜索
注意:请根据你的实际国家/地区修改region参数(例如中国用CN、美国用US)。
内容的提问来源于stack exchange,提问作者Reynaldo
相关产品推荐
相关产品推荐

