2

I have a User defined, partly, as so:

class User(AbstractBaseUser):
    ...
    email = models.EmailField(unique=True)
    type = models.IntegerField(choices=STATUS_CHOICES)
    verified = models.BooleanField(default=False)
    created_date = models.DateTimeField(default=timezone.now)

    USERNAME_FIELD = 'email'

...

A user can either be a Freelancer or a Client. Take Freelancer as an example:

class Freelancer(models.Model):
    user = models.ForeignKey(User)
    first_name = models.CharField(max_length=128)
    ...

I've created a form for a user to register. When I register I get the type of user they selected and create a record in the appropriate table:

if form.is_valid():
            user = form.save(commit=False)
            user.set_password(user.password)
            user.save()
            # create subgroup based on user type
            if user.type == 1:
                fl = Freelancer(user=user)
                fl.save()

So now I have a User and a Freelancer linked to that user and now I wish to let the user be able to edit all their details:

class Profile(UpdateView):
    model = User
    form_class = UserUpdateForm
    second_form_class = FreelanceUpdateForm
    template_name = "freelancestudent/profile.html"

    def get_queryset(self):
        queryset = super(Profile, self).get_queryset()
        if not self.request.user.is_authenticated():
            return queryset.none()
        else:
            return queryset.filter(pk=self.request.user.pk)

    def get_context_data(self, **kwargs):
            context = super(Profile, self).get_context_data(**kwargs)
            context['form'] = self.form_class(self.request.GET, instance=self.request.user)
            context['form2'] = self.second_form_class(self.request.GET, instance=self.request.user)
            return context

    def get(self, request, *args, **kwargs):
        super(Profile, self).get(request, *args, **kwargs)
        form = self.form_class
        form2 = self.second_form_class
        return self.render_to_response(self.get_context_data(
            object=self.object, form=form, form2=form2))

The forms look like this:

class UserUpdateForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('email',)


class FreelanceUpdateForm(forms.ModelForm):
    class Meta:
        model = Freelancer
        fields = ('university',)

The problem is it won't populate the data with existing data. I looked at this which led me to the instance=self.request.user idea and as I debug I can see it does get that instance of a user but no population. Why is this?

Community
  • 1
  • 1
Nanor
  • 2,400
  • 6
  • 35
  • 66

1 Answers1

1

You have to use initial attribute to populate your form.

Here is an example to populate email field of the user. Don't forget to remove self.request.GET, it's useless in this view and it can't work with:

context['form'] = self.form_class(instance=self.request.user, initial={'email':self.request.user.email})

Read Django documentation for more information: dynamic-initial-values

Louis Barranqueiro
  • 10,058
  • 6
  • 42
  • 52