Search code examples
pythondjango-modelsdjango-formsdjango-usersdjango-file-upload

User creation - email field and image field not updating Postgres


In an extended user model with User and Profile created together. The user and related profile(Customer) is created but two fields 'email'(user email) field and 'photo'(image field) is not saved into database. Appreciate some fix:

views.py

def customer_register(request):

if request.method == 'POST':
    user_form = UserRegistrationForm(request.POST)
    profile_form = CustomerProfileForm(request.POST)

if user_form.is_valid() and profile_form.is_valid():
    # Create a new user object but avoid saving it yet
    new_user = user_form.save(commit=False)
    # Set the chosen password
    new_user.set_password(
        user_form.cleaned_data['password'])
    # Save the User object
    new_user.save()
    # Create the customer profile
    customer = profile_form.save(commit=False)
    customer.user = new_user
    customer.save()

    #Customer.objects.create(user=new_user,date_of_birth=customer.date_of_birth, photo=customer.photo, pincode=customer.pincode)

    return render(request,
                  'registration/register_done.html',
                  {'new_user': new_user})
else:
    messages.error(request, 'Error in creating your profile')

else: user_form = UserRegistrationForm() profile_form = CustomerProfileForm()

Forms.py

class UserRegistrationForm(forms.ModelForm):
password = forms.CharField(label='Password',
                           widget=forms.PasswordInput)
password2 = forms.CharField(label='Repeat password',
                            widget=forms.PasswordInput)
email = forms.EmailField(label='email', widget=forms.EmailInput, required=True)


class Meta:
    model = User
    fields = ['username', 'first_name', 'email']

def clean_password2(self):
    cd = self.cleaned_data
    if cd['password'] != cd['password2']:
        raise forms.ValidationError('Passwords don\'t match.')
    return cd['password2']

def clean_email(self):
    email = self.cleaned_data.get('email')
    if User.objects.filter(email=email).exists():
         raise forms.ValidationError("Email exists. Please change email")

class CustomerProfileForm(forms.ModelForm):
    pincode = INZipCodeField(label="PIN")
    date_of_birth = forms.DateField(widget=forms.DateInput(format='%d/%m/%Y'), input_formats=('%d/%m/%Y',))
    photo = forms.ImageField()
    class Meta:
        model = Customer
        fields = ['pincode','date_of_birth','photo']

Solution

  • I figured out the email id issue was in the form, form had to return the email in the email validation function

    clean_email(self):
        email = self.cleaned_data.get('email')
        if User.objects.filter(email=email).exists():
             raise forms.ValidationError("Email exists. Please change email")
        return email
    

    In the views I had to add request for files(image) along with form:

    profile_form = CustomerProfileForm(request.POST, request.FILES or None)
    

    The image issue was in the registration html template. I updated the form to enctype "multipart/form-data" to take get image inputs

     <form method="post" enctype="multipart/form-data" action="{% url 'customer_register' %}">
              {% csrf_token %}