我的Django模型域出了什么问题?

2024-09-29 01:36:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试做一个PhoneField,将值转换为标准值。在

在这种情况下,我想使用这种干净的方法。在

def clean(self):
    phone = self.cleaned_data.get('phone')

    # Is it already standardized ?
    if phone.startswith('+'):
      mo = re.search(r'^\+\d{2,3}\.\d{9,11}$', phone)

      if not mo:
        raise forms.ValidationError(_(u'Vous devez entrer un numéro de téléphone. (+33.389520638 ou 0389520638).'))
      else:
        return phone

    # If not, it must be a french number.
    phone = re.sub("\D", "", phone) # Suppression des caractères séparateurs

    mo = re.search(r'^\d{10}$', phone) # Numéro à 10 chiffres
    if not mo:
        raise forms.ValidationError(_(u'Vous devez entrer un numéro de téléphone. (+33.389520638 ou 0389520638).'))
    else:
        phone = mo.group()[-9:]

    return u'+33.%s' % phone

如果我把它用在形式上,它会很好地工作。 但我想把它用作表单域。在

我试着这样做:

^{pr2}$

但是clean方法永远不会被调用。你能帮助我吗?在


Tags: 方法selfrecleansearchifronot
2条回答

您正在混合模型字段和表单字段。在

首先需要定义表单字段,然后需要要求相应的模型字段将这些表单字段用于模型表单。在

specifying-the-form-field-for-a-model-field documentation

基本上,您需要在model字段上定义一个名为formfield的方法

def formfield(self, **kwargs):
    # This is a fairly standard way to set up some defaults
    # while letting the caller override them.
    defaults = {'form_class': MyFormField}
    defaults.update(kwargs)
    return super(HandField, self).formfield(**defaults)

您在上面创建的字段有一个干净的方法,这是表单字段的要求,而不是模型字段

所以,现在您应该定义一个表单字段(您已经定义的表单字段,除了从forms.CharField扩展而不是从models.CharField)扩展它之外,然后根据模型字段创建定义定义定义一个模型字段,并包括上面所述的方法。在

或者,简单地说,您可以选择定义一个表单字段,然后在模型表单中重写这个特定模型字段的默认表单字段。(在这种情况下,除非从该模型表单输入数据,否则不会进行验证)

以下是我如何使用becomingGuru修复它的帮助:)

 class PhoneFormField(forms.CharField):
     widget = PhoneInput

     def clean(self, value):
         phone = super(PhoneFormField, self).clean(value)

         # Le numéro contient-il un indicatif ?
         if phone.startswith('+'):
           mo = re.search(r'^\+\d{2,3}\.\d{9,11}$', phone)

           if not mo:
             raise forms.ValidationError(_(u'Vous devez entrer un numéro de téléphone. (+33.389520638 ou 0389520638).'))
           else:
             return phone

         # Pas d'indicatif : on est en France par défaut
         phone = re.sub("\D", "", phone) # Suppression des caractères séparateurs

         mo = re.search(r'^\d{10}$', phone) # Numéro à 10 chiffres
         if not mo:
             raise forms.ValidationError(_(u'Vous devez entrer un numéro de téléphone. (+33.389520638 ou 0389520638).'))
         else:
             phone = mo.group()[-9:]

         return u'+33.%s' % phone

 class PhoneField(models.CharField):
     def __init__(self, *args, **kwargs):
         kwargs['max_length'] = 16
         super(PhoneField, self).__init__(*args, **kwargs)

     def get_internal_type(self):
         return "CharField"

     def formfield(self, form_class=PhoneFormField, **kwargs):
         return super(PhoneField, self).formfield(form_class=form_class, **kwargs)

谢谢你的帮助。在

相关问题 更多 >