【发布时间】:2015-04-30 07:18:06
【问题描述】:
我有一个模型,其中包含电话号码 external_number,存储为 char 字段:
models.py
class PhoneRecord(models.Model):
def __unicode__(self):
return "Call to %s (%s)" % (self.external_number, self.call_date.strftime("%c"))
INBOUND = "I"
OUTBOUND = "O"
DIRECTION_CHOICES = (
(INBOUND, "Inbound"),
(OUTBOUND, "Outbound"),
)
external_number = models.CharField(max_length=20)
call_date = models.DateTimeField()
external_id = models.CharField(max_length=20)
call_duration = models.TimeField()
call_direction = models.CharField(max_length=1, choices=DIRECTION_CHOICES, default=INBOUND)
call = models.FileField(upload_to='calls/%Y/%m/%d')
表单正在使用来自https://github.com/g1smd/django-localflavor-UK-forms/blob/master/django/localflavor/uk/forms.py 的UKPhoneNumberField 清理和存储数据
这意味着该号码以 01234 567890 的格式存储在数据库中,即其中有一个空格。
我使用django-filters 创建了一个过滤器,它在搜索部分电话号码时效果很好除了,当搜索词不包含空格时它不能正确过滤。即
- 搜索
01234会返回上例的记录 - 搜索
567890会返回上例的记录 - 搜索
01234 567890会返回上例的记录 - 搜索
01234567890不返回上例的记录
现在,我可以使过滤器上的表单受到相同的限制(即 UKPhoneNumberField 作为输入屏幕,但这会导致无法搜索部分电话号码。
我还探索了使用 django-phonenumber-field 之类的东西来控制模型和表单的可能性,但是 UKPhoneNumberField 提供的验证允许我根据输入的数字类型(例如移动或地理)。
我最理想的情况是
- 我的过滤器会忽略用户在搜索查询中输入的空格或存储值中的任何空格。这甚至可能吗?
- 将
UKPhoneNumberField提供的验证应用到另一个字段类型,而无需分析和重写所有提供的正则表达式。 - 我还没有找到其他一些英国电话号码验证!
【问题讨论】:
-
我知道这不能回答你的问题,但如果我是你,我会存储没有空格的数字,并在必要时显示它们的格式。
-
谢谢@Selcuk - 我可能不得不走这条路。我一直在挑选
UKPhoneNumberField的代码,我可能比其他解决方案更快!
标签: regex django forms validation