1

My forms.py file

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(),
        }

My models.py file

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)

My views.py file

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)

Upon clicking the register page an error is displayed

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

So is there no way I can save the data from my form and hence I would have to make new Custom User Model to save phone number of a user on register page?

My admin.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)

2 Answers2

0

If your model is created correctly, the mistake you are making is your variable user is not a User object. The error informs you that user variable represents a string (from the form's input), which does not have User as its attribute. In this case, you might have to do something like

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

in order to assign the User object to variable user.

Now that user is a User object, then, you can do

user.phone_number = phone
user.save()
gunsodo
  • 175
  • 1
  • 10
  • user=form.cleaned_data.get('username') user=User.objects.get(username=user) phone=form.cleaned_data.get('phone') user.phone_number=phone user.save() Changed it to this. Still can"t find it in admin.py or my database – LastCodebender Aug 23 '20 at 14:13
  • changed the question to reflect the changes I made. – LastCodebender Aug 23 '20 at 15:01
0

Please try this:

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)

Are you display phone field for admin then,

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)
Riyas Ac
  • 1,553
  • 1
  • 9
  • 23