I have a custom User model to manage some profiles user: is_student, is_professor and is_executive
In this model, in addition, I have the get_student_profile(), get_professor_profile() andget_executive_profile() methods to get the user profiles data of each user from my different views. class User(AbstractBaseUser, PermissionsMixin): email = models.EmailField(unique=True) username = models.CharField(max_length=40, unique=True) slug = models.SlugField(max_length=100, blank=True) is_student = models.BooleanField(default=False) is_professor = models.BooleanField(default=False) is_executive = models.BooleanField(default=False) def get_student_profile(self): student_profile = None if hasattr(self, 'studentprofile'): student_profile = self.studentprofile return student_profile def get_professor_profile(self): professor_profile = None if hasattr(self, 'professorprofile'): professor_profile = self.professorprofile return professor_profile def get_executive_profile(self): executive_profile = None if hasattr(self, 'executiveprofile'): executive_profile = self.executiveprofile return executive_profile In addition each profile user is_student, is_professor and is_executive have their own model in where I manage their own data: class StudentProfile(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) slug = models.SlugField(max_length=100,blank=True) origin_education_school = models.CharField(max_length=128) current_education_school = models.CharField(max_length=128) extra_occupation = models.CharField(max_length=128) class ProfessorProfile(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) slug = models.SlugField(max_length=100,blank=True) class ExecutiveProfile(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE) slug = models.SlugField(max_length=100,blank=True) Is of this way that in my User model I override the save() method to denote that the usernamefield of an user which is created, to be equal in their value to the slug belonging to the profile user which will take that user ( StudentProfile, ProfessorProfile, ExecutiveProfile): def save(self, *args, **kwargs): user = super(User,self).save(*args,**kwargs) # Creating an user with student, professor and executive profiles if self.is_student and not StudentProfile.objects.filter(user=self).exists() \ and self.is_professor and not ProfessorProfile.objects.filter(user=self).exists() \ and self.is_executive and not ExecutiveProfile.objects.filter(user=self).exists(): student_profile = StudentProfile(user=self) student_slug = self.username student_profile.slug = student_slug professor_profile = ProfessorProfile(user=self) professor_slug = self.username professor_profile.slug = professor_slug executive_profile = ExecutiveProfile(user=self) executive_slug = self.username executive_profile.slug = executive_slug student_profile.save() professor_profile.save() executive_profile.save() # And so for all possibles profile combinations To these three profiles which I have three forms in where their own fields are generated class StudentProfileForm(forms.ModelForm): class Meta: model = StudentProfile fields = ('origin_education_school', 'current_education_school', 'extra_occupation') class ProfessorProfileForm(forms.ModelForm): class Meta: model = ProfessorProfile fields = ('occupation',) class ExecutiveProfileForm(forms.ModelForm): class Meta: model = ExecutiveProfile fields = ('occupation', 'enterprise_name', 'culturals_arthistic','ecological') I access to view profile to user through of this URL: url(r"^profile/(?P<slug>[\w\-]+)/$", views.account_profiles__update_view, name='profile' ), In my function based view account_profiles__update_view() I am managing the request of the user, and creating the form instances (StudentProfileForm, ProfessorProfileForm, ExecutiveProfileForm) according to the profile to user (is_student, is_professor and is_executive) @login_requireddef account_profiles__update_view(request, slug): user = request.user # user = get_object_or_404(User, username = slug) # empty list _forms = [] if user.is_student: profile = user.get_student_profile() _forms.append(forms.StudentProfileForm) if user.is_professor: profile = user.get_professor_profile() _forms.append(forms.ProfessorProfileForm) if user.is_executive: profile = user.get_executive_profile() _forms.append(forms.ExecutiveProfileForm) # user = get_object_or_404(settings.AUTH_USER_MODEL, username = slug) if request.method == 'POST': # Create a list with all formularies in which there is some POST # operation. This mean if there is one, two or three profiles together # or individual formularios =[Form(data = request.POST,instance=profile) for Form in _forms] if all([form.is_valid() for form in formularios]): # Only save dato to database if all formularies that send # the user in their request are correct or well formed in their # data. Check that all formularies has been filled for form in formularios: profile = form.save(commit=False) profile.user = user profile.save() return redirect('dashboard') else: formularios = [Form() for Form in _forms] # Access to class Forms instanced (StudentProfileForm, # ProfessorProfileForm, ExecutiveProfileForm), through the __class__ # pŕoperty which return the class onlying. An this class have another # property named __name__ which return the name of string of a class, # which is the same name with I did name the form classes # (StudentProfileForm, ProfessorProfileForm, ExecutiveProfileForm) # Next I call to their string method to grant that I always will return # a string and I call to lower. # The idea with this is place data into a python dictionarie and access # to it data = {form.__class__.__name__.__str__().lower(): form for form in formularios} data['userprofile'] = profile return render(request, 'accounts/profile_form.html', data,) And my profile_form.html template I have the following small logic: <form method="POST"> {% csrf_token %} {% if userprofile.user.is_student %} <div align="center"><i>My Student Profile data</i></div> {% bootstrap_form studentprofileform %} {{ studentprofileform.non_field_errors }} {% endif %} {% if userprofile.user.is_professor %} <div align="center"><i>My Professor Profile data</i></div> {% bootstrap_form professorprofileform %} {{ professorprofileform.non_field_errors }} {% endif %} {% if userprofile.user.is_executive %} <div align="center"><i>My Executive Profile data</i></div> {% bootstrap_form executiveprofileform %} {{ executiveprofileform.non_field_errors }} {% endif %} <input type="submit" value="Save Changes" class="btn btn-default"></form> I wanted to write all these details to comment the following situation which happen to me: I render the three forms in my template Only store data related to the latest user profile selected, this mean: profiles: is_student, is_professor and is_executive - User with is_student profile ... Save data - - User with is_professor profile ... Save data - - User with is_executive profile ... Save data - - User with is_student and is_professor profile: Only save data to is_professor profile. Does not save data in is_student profile forms fields - - User with is_student and is_executive profile: Only save data to is_executive profile. Does not save data in is_student profile forms fields - - User with is_professor and is_executive profile: Only save data to is_executiveprofile. Does not save data in is_professor profile forms fields - - User with is_student, is_professor and is_executive profiles: Only save data to is_executive profile. Does not save data in is_professor and is_student profile forms fields In this moment, only is taked in account the latest selected profile user and according to it, save their related data and not other. This is because in my account_profiles__update_view() function based view I have this if .. sentences logic: if user.is_student: profile = user.get_student_profile() _forms.append(forms.StudentProfileForm)if user.is_professor: profile = user.get_professor_profile() _forms.append(forms.ProfessorProfileForm)if user.is_executive: profile = user.get_executive_profile() _forms.append(forms.ExecutiveProfileForm) But, I unknown if I will should consider perform here all the profiles user combinations possibles and create the same combination of form instances possibles too. Is this factible of perform? I try perfom account_profiles__update_view() as a class based view, here some code about it <https://pastebin.com/pYbxTnCh> but the characterization of profiles and instances forms send to the template, make me that I choose the function based view option. ¿What is the best alternative? My apologies for the long question, I did want give all details for to better understanding of my code and approach that I want accomplish. I appreciate highly some support and orientation. -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscr...@googlegroups.com. To post to this group, send email to django-users@googlegroups.com. Visit this group at https://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/04ef3516-fc59-4e71-8155-3d1134d7dabd%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.