gpt4 book ai didi

python - 我的 django 模型字段有什么问题?

转载 作者:行者123 更新时间:2023-11-28 20:54:26 25 4
gpt4 key购买 nike

我正在尝试做一个将值转换为标准化值的 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

如果我在表单中使用它,效果很好。但我想将其用作表单域。

我试过这样做:

EMPTY_VALUES = (None, '')

class PhoneInput (forms.TextInput):
def render(self, name, value, attrs=None):
if value not in EMPTY_VALUES:
value = phone_render(value)
else:
value = None

return super(PhoneInput, self).render(name, value, attrs)

class PhoneField(models.CharField):
widget = PhoneInput

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

def get_internal_type(self):
return "CharField"

def clean(self, value):
phone = super(PhoneField, 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

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

最佳答案

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

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

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

基本上,您需要在模型字段上定义一个名为 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)然后定义一个模型字段,根据模型字段创建定义,并包含上述方法。

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

关于python - 我的 django 模型字段有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1635392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com