3

Problem description: UserProfile form doesn't save any data. I am creating a new User and automatically create a UserProfile object for him (so I'm extending UserProfile), so I can go to admin page and fill all the fields . But when I'm trying to do it from client side, my form just doesn't catch the data. Also the strangest moment is that I can change username and email using UserChangeForm, so I'm trying to do the same for UserProfileObject.

models.py:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    image = models.ImageField(upload_to='profile_image', blank=True)
    title =  models.CharField(max_length=100, default = '')
    first_name = models.CharField(max_length=200, default = '')
    last_name = models.CharField(max_length=200, default = '')
    subject = models.ManyToManyField('Subject', related_name='tutor_type', default = '', help_text="Select a subject")
    AREA_STATUS = (
        ('Jerusalem', 'Jerusalem'),
        ('Tel Aviv', 'Tel Aviv'),
        ('Haifa', 'Haifa'),
        ('Eilat', 'Eilat')
    )
    area = models.CharField(max_length=200, choices=AREA_STATUS, blank=True, default='', help_text='Tutor area')
      # Foreign Key used because tutor can only have one area, but area can have multiple tutors
      # Author as a string rather than object because it hasn't been declared yet in file.
    description = models.TextField(max_length=4000, help_text="Enter a brief description about yourself")
    charge = models.IntegerField(default = '0')
      # ManyToManyField used because Subject can contain many tutors. Tutors can cover many subjects.
      # Subject declared as an object because it has already been defined.
    LANGUAGE_CHOICES = (
        ('English','English'),
        ('Hebrew','Hebrew'),
        ('Russian','Russian'),
        ('French','French'),
        ('Arabic','Arabic'),
    )
    language = models.CharField('Language', choices = LANGUAGE_CHOICES, max_length=50, null=True)

    def __str__(self):
        return self.user.username

    def display_subject(self):
        """
        Creates a string for the subject. This is required to display subject in Admin.
        """
        return ', '.join([ subject.name for subject in self.subject.all()[:3] ])
        display_subject.short_description = 'Subject'

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

post_save.connect(create_profile, sender = User)

forms.py::

class EditProfileForm(UserChangeForm):

    class Meta:
        model = User
        fields = (
            'username',
            'email',
            'password'
        )

class EditExtendedProfileForm(UserChangeForm):

    class Meta:
        model = UserProfile
        fields = '__all__'
        exclude = ('user',)

views.py:

def edit_profile(request):
    if request.method == 'POST':
        form = EditProfileForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            return redirect(reverse('accounts:view_profile'))
    else:
        form = EditProfileForm(instance=request.user)
        args = {'form': form}
        return render(request, 'accounts/edit_profile.html', args)

def edit_extended_profile(request):
    if request.method == "POST":
        form = EditExtendedProfileForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            return redirect(reverse('accounts:view_profile'))
        else:
            return redirect(reverse('accounts:edit_extended_profile'))
    else:
        form = EditExtendedProfileForm(instance = request.user)
        args = {'form':form}
        return render(request, 'accounts/edit_extended_profile.html', args)

edit_extended_profile.html:

{% extends "base.html" %}

{% block head %}
<title>Profile</title>
{% endblock %}

{% block body %}
<div class = "container">
<form method="POST">
  {% csrf_token %}
  {{form.as_p}}
  <button type = "submit" class = "btn btn-success">Submit</button>
</form>
</div>
{% endblock %}

and it is the same template as for edit_profile view.

No traceback, no errors. Any help will be appreciated. Thanks in advance.

Alice Jarmusch
  • 467
  • 1
  • 7
  • 20
  • 1
    This could help you https://blog.khophi.co/extending-django-user-model-userprofile-like-a-pro/ – Abijith Mg Mar 20 '17 at 18:01
  • Yes, it worked now (tried before, failed), thanks! Maybe you also can suggest anything to override Mezzanine ImageField and allows users to upload their profile pictures? – Alice Jarmusch Mar 20 '17 at 20:38

0 Answers0