如何在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?对不起,我的不好!应该仔细观察。无论如何,谢谢!是的,作者为表单字段和模型使用了相同的名称,因此很容易输入错误!