user9092892
user9092892

Reputation:

form object has no attribute 'email' in django

I have a registration form made of 2 forms, from which email field gets saved in both User and Student models. Now, I made an update account info view. Problem is, I want that email will get updated the in both models. But I get error:

'StudentEditForm' object has no attribute 'email'

Here is my code:

class StudentEditForm(forms.ModelForm):
    email = forms.EmailField(required=False)
    name = forms.CharField(max_length=30)
    surname = forms.CharField(max_length=50)
    photo = forms.ImageField(required=False)
    phone = forms.CharField(max_length=15, required=False)

    class Meta:
        model = Student
        fields = ('email', 'name', 'surname', 'phone', 'photo')
class User(AbstractUser):
    pass


class Student(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    name = models.CharField(max_length=30, null=True, blank=True, default=None)
    surname = models.CharField(max_length=50, null=True, blank=True, default=None)
    email = models.EmailField(unique=True, null=True, blank=True, default=None)
    student_ID = models.CharField(unique=True, max_length=14,
                                  validators=[RegexValidator(regex='^.{14}$',
                                                             message='The ID needs to be 14 characters long.')],
                                  null=True, blank=True, default=None)
    photo = models.ImageField(upload_to='students_images', null=True, blank=True, default=None)
    phone = models.CharField(max_length=15, null=True, blank=True, default=None)

    def __str__(self):
        return self.surname
        
 
User.student = property(lambda p: Student.objects.get_or_create(user=p)[0])
def profile_edit(request):
    user = request.user
    student = request.user.student
    if request.method != 'POST':
        form = StudentEditForm(instance=student)

    else:
        form = StudentEditForm(request.POST, instance=student)
        user.email = form.email
        form.save()
        return render(request, 'index.html')
    context = {
        "form": form,
    }
    return render(request, "registration/profile_edit.html", context)

Again, I need that I will be able to update the email fields. And the email will get saved in User email but also I want it saved to Student email.

Upvotes: 1

Views: 2416

Answers (2)

user9092892
user9092892

Reputation:

I had to add

form.is_valid()

and

user.email = form.cleaned_data['email'] 

but also to add user.save() which solved this issue.

Upvotes: 0

Paweł Kordowski
Paweł Kordowski

Reputation: 2768

call form.is_valid() and then use form.cleaned_data['email'], see https://docs.djangoproject.com/en/1.11/topics/forms/

Upvotes: 1

Related Questions