【问题标题】:How do I save PhoneNumberField data to database?如何将 PhoneNumberField 数据保存到数据库?
【发布时间】:2020-12-12 05:28:56
【问题描述】:

我的 forms.py 文件

class CreateUserForm(UserCreationForm):
    phone=PhoneNumberField()
    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2', 'phone']
        widgets={
            'username':forms.TextInput(attrs={'placeholder':"Username"}),
            'email':forms.TextInput(attrs={'placeholder':"Email Address"}),
            'password1': forms.PasswordInput(attrs={'placeholder': 'Your Password'}),
            'password2': forms.PasswordInput(attrs={'placeholder': 'Confirm Password'}),
            'phone':PhoneNumberField(),
        }

我的 models.py 文件

class CustomerReg(models.Model):
    user=models.OneToOneField(User, null=True, blank=True, on_delete=models.CASCADE)
    name=models.CharField(max_length=200, null=True)
    email=models.EmailField(max_length=254)

def create_profile(sender, **kwargs):
    if kwargs['created']:
        user_profile=CustomerReg.objects.create(user=kwargs['instance'])

post_save.connect(create_profile, sender=User)

我的views.py文件

def registerPage(request):
    if request.user.is_authenticated:
        return redirect('form')
    else:
        form=CreateUserForm()

        if request.method == 'POST':
            form = CreateUserForm(request.POST)
            if(form.is_valid()):
                form.save()
                user=form.cleaned_data.get['username']
                user=User.objects.get(username=user)
                phone=form.cleaned_data.get['phone']
                user.phone_number=phone
                user.save()
                return redirect('login')

        context = {'form': form}
        return render(request, 'customer/register.html', context)

点击注册页面时会显示错误

AttributeError at /register/
'str' object has no attribute 'User'

那么我有没有办法保存表单中的数据,因此我必须创建新的自定义用户模型才能在注册页面上保存用户的电话号码?

我的管理员.py

from django.contrib import admin
from .models import *
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from .forms import UserChangeForm,UserCreationForm
# Register your models here.

admin.site.register(Customer)

class UserAdmin(BaseUserAdmin):
    form = UserChangeForm
    add_form = UserCreationForm
    list_display = ('email', 'phone')

admin.site.register(User, UserAdmin)

【问题讨论】:

  • 您想要电话号码验证吗??如果您愿意,请参考reference
  • 不,我不想要验证,我只想在我的管理页面或数据库中查看它
  • 哦是的很好,但是有什么方法可以在我的 django 管理员或数据库中显示它?
  • 请添加admin.py文件
  • 已更新。请检查。我尝试添加 admin.site.register(User) 但它说用户已经定义为 auth.UserAdmin

标签: django django-models django-forms django-users


【解决方案1】:

如果您的模型创建正确,那么您所犯的错误是您的变量 user 不是 User 对象。该错误通知您user 变量表示一个字符串(来自表单的输入),它没有User 作为其属性。在这种情况下,您可能需要执行类似的操作

user = User.objects.get(username=user)

为了将User 对象分配给变量user。

既然user 是一个User 对象,那么,你可以这样做

user.phone_number = phone
user.save()

【讨论】:

  • user=form.cleaned_data.get('username') user=User.objects.get(username=user) phone=form.cleaned_data.get('phone') user.phone_number=phone user .save() 改成这个。仍然无法在 admin.py 或我的数据库中找到它
  • 更改了问题以反映我所做的更改。
【解决方案2】:

请试试这个:

def registerPage(request):
    if request.user.is_authenticated:
        return redirect('form')
    else:
        form=CreateUserForm()

        if request.method == 'POST':
            form = CreateUserForm(request.POST)
            if form.is_valid():
                form.save()
                username=form.cleaned_data['username']
                user=User.objects.get(username=username)
                phone=form.cleaned_data['phone']
                user.phone=phone
                user.save()
                return redirect('login')

        context = {'form': form}
        return render(request, 'customer/register.html', context)

那么您是否为管理员显示电话字段,

admin.py

from .forms import UserChangeForm,UserCreationForm
from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
class UserAdmin(BaseUserAdmin):
    form = UserChangeForm
    add_form = UserCreationForm
    list_display = ('email', 'phone') # You can add field to display field here..
    list_filter = ('name')
    fieldsets = (
       (None, {'fields': ('email')}),
       ('Personal info', {'fields': ('name','phone')}),
       ('Permissions', {'fields': ('name',)}),
    )
    add_fieldsets = (
       (None, {
          'classes': ('wide',),
          'fields': ('name' ,'user','email','email', 'phone')
       }),
    )
    search_fields = ('email',)
    ordering = ('email',)
    filter_horizontal = ()
admin.site.register(User, UserAdmin)

【讨论】:

  • 如何在我的管理页面或数据库中查看?
  • 试试这个。这里list_display是要显示给管理员的字段
  • 是的,我也想显示电话号码字段。这就是我面临的问题。
  • 我进行了更改。更新了我的问题以反映它。我不需要像客户模型一样注册它才能在我的管理页面上查看它吗?
  • admin.site.register(User, UserAdmin) 这写在 admin.py 文件的底部
猜你喜欢
  • 1970-01-01
  • 2019-11-22
  • 2011-10-26
  • 2013-05-08
  • 1970-01-01
  • 2012-04-05
  • 2019-12-06
  • 2013-04-24
  • 1970-01-01
相关资源
最近更新 更多