如何在forms.py中使用django-phonenumber_字段?
我试图从用户那里获取电话号码,作为他的个人资料更新的一部分。我最近从如何在forms.py中使用django-phonenumber_字段?,django,Django,我试图从用户那里获取电话号码,作为他的个人资料更新的一部分。我最近从stackoverflow中发现,有一个库django-phonenumber\u字段,我可以轻松地输入电话号码。因此我在model.py中使用了它,如下所示 phone=PhoneNumberField(blank=True) 正如在github存储库的django-phonenumber\字段中提到的那样 那 与CharField一样,不鼓励使用null=True 所以我也没用。然后我尝试在forms.py中使用phone字
stackoverflow
中发现,有一个库django-phonenumber\u字段
,我可以轻松地输入电话号码。因此我在model.py中使用了它,如下所示
phone=PhoneNumberField(blank=True)
正如在github存储库的django-phonenumber\字段中提到的那样
那
与CharField一样,不鼓励使用null=True
所以我也没用。然后我尝试在forms.py
中使用phone字段。最初,我使用此功能之前,我了解了电话字段
:
phone=forms.IntegerField(widget=forms.TextInput(attrs={'class':'form control'}),required=True)
当我将其更改为phone=PhoneNumberField()
我正在迁移,它引发了字段错误
。我找不到任何表单。PhoneNumberField()
。因此,当我将字段保持为Integerfield
并运行服务器时,我试图从用户那里获取输入,但我得到了以下错误:
非空约束失败:身份验证配置文件。电话
然后我将phone=PhoneNumberField(blank=True)
更改为phone=PhoneNumberField(null=True,blank=True)。
不鼓励这样做。在那之后,虽然我没有得到任何错误,但是无论在电话字段中输入什么用户类型
,它总是在数据库中设置null
。可能是因为我使用了Integerfield
我保存了上面提到的forms.py
。或者我不知道原因
如何在表单中添加PhoneNumberField()
或任何机制,以便在数据库中保存用户给定的值
编辑
正如@Sam Bobel让我详细发布models.py
的内容,这里是:
from __future__ import unicode_literals
from django.contrib.auth.models import User
from django.db import models
from django.db.models.signals import post_save
from django.utils.encoding import python_2_unicode_compatible
from django.dispatch import receiver
from phonenumber_field.modelfields import PhoneNumberField
@python_2_unicode_compatible
class Profile(models.Model):
user = models.OneToOneField(User)
# location = models.CharField(max_length=50, null=True, blank=True)
# url = models.CharField(max_length=50, null=True, blank=True)
# job_title = models.CharField(max_length=50, null=True, blank=True)
user_sex = (('MALE', 'Male'), ('FEMALE', 'Female'))
sex = models.CharField(max_length=6, default='Male', choices=user_sex)
address = models.CharField(max_length=250, null=True, blank=True)
city = models.CharField(max_length=250, null=True, blank=True)
state = models.CharField(max_length=250, null=True, blank=True)
country = models.CharField(max_length=250, null=True, blank=True)
phone = PhoneNumberField(null=True)
zip = models.IntegerField(null=True, blank=True)
about = models.CharField(max_length=250, null=True, blank=True)
email_confirmed = models.BooleanField(default=False)
account_type = models.IntegerField(default=-1)
class Meta:
db_table = 'auth_profile'
def __str__(self):
return self.user.username
现在,如果我运行迁移,我会
You are trying to change the nullable field 'phone' on profile to non-nullable without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Ignore for now, and let me handle existing rows with NULL myself (e.g. because you added a RunPython or RunSQL operation to handle NULL values in a previous data migration)
3) Quit, and let me add a default in models.py
Select an option:
**forms.py
**:
class ContactForm(forms.ModelForm):
address = forms.CharField(
widget=forms.Textarea(attrs={'class': 'form-control', 'rows': 4}),
max_length=300,
required=True)
city = forms.CharField(
widget=forms.TextInput(attrs={'class': 'form-control'}),
max_length=30,
required=True)
state = forms.CharField(
widget=forms.TextInput(attrs={'class': 'form-control'}),
max_length=30,
required=True)
country = forms.CharField(
widget=forms.TextInput(attrs={'class': 'form-control'}),
max_length=30,
required=True)
phone = forms.IntegerField(widget=forms.TextInput(attrs={'class': 'form-control'}),
required=True)
zip = forms.IntegerField(widget=forms.TextInput(attrs={'class': 'form-control'}),
required=True)
class Meta:
model = User
fields = ['address', 'city', 'state', 'country', 'phone', 'zip']
看起来您试图从错误的位置导入PhoneNumberField。如果我理解正确,forms.PhoneNumberField
不存在
首先,确保已安装的应用程序中有phonenumber\u字段
(库的自述文件显示了如何执行此操作)
第二,确保导入正确。from phonenumber_field.modelfields import PhoneNumberField
应位于models.py的顶部
第三,在模型中,说'field\u name=PhoneNumberField(blank=True)
然后您应该能够进行迁移
如果这太离谱了,你会更完整地发布你的模型代码吗?以下是我在我的项目中使用phonenumber字段的方式,到目前为止,它工作正常,没有任何问题。而且我在迁移方面也没有遇到任何问题
内部模型:
from phonenumber_field.modelfields import PhoneNumberField
phonenumber = PhoneNumberField(blank=True)
内部表格:
from phonenumber_field.formfields import PhoneNumberField
class ExampleForm(forms.ModelForm):
phonenumber = PhoneNumberField(widget=forms.TextInput(attrs={'placeholder': _('Phone')}),
label=_("Phone number"), required=False)
是的,我没有找到任何类似于表单的东西。PhoneNumberField也
。我在安装的应用程序中有phonenumber\u字段
。我从phonenumber\u字段导入了。modelfields在models.py中导入PhoneNumberField
,但不在顶部。如果我在PhoneNumberField()中省略null=True
)
它要求我首先输入一些默认值。我已经发布了模型。py
你也可以发布你的导入语句吗?最后,你在迁移时收到的完整错误消息?我已经发布了导入。我认为你都很好,这不是一个错误。它说:这过去可以为null,现在不能了。我们应该怎么做h旧的空值?您应该键入“1”来添加一个一次性默认值,并提供一个空字符串的默认值。这将把以前为空的所有值设置为“”,这应该可以。我得到了以下错误:super(PhoneNumberField,self)。\uuuuuuuuu init\uuuu(*args,**kwargs)TypeError:\uuuuu init\uuuuu()获取了一个意外的关键字参数“widget”
我希望您从FORMFIELDS导入(从phonenumber\u field.FORMFIELDS导入PhoneNumberField)而不是像from phonenumber_field那样从MODELFIELDS导入PhoneNumberField。MODELFIELDS导入PhoneNumberField?对不起,我的不好!应该仔细观察。无论如何,谢谢!是的,作者为表单字段和模型使用了相同的名称,因此很容易输入错误!