Thursday, April 26, 2018

Creating users represented by two models in OneToOne relation

Hi,


This quesion is related to the common pattern of representing a site

user (henceforth referred to as "member"), by two models that have a

one-to-one relation:


1. A builtin `contrib.auth.models.User' model, used for authentication,

   that holds credentials and basic information.


2. An application specific `Profile' model with additional personal

   information, such as language for example. `Profile.user' is a

   `OneToOneField' pointing to `auth.User'


My questions relate to the creation of such members, for which the

responsible view must populate and save two model instances with the

submitted form data.


• What approaches would you recommend to implement the member creation

  form?

• How could generic class-based views be efficiently leveraged to handle

  member creation?


I briefly present my current solution below, with its limitations.


1. Form: a `ModelForm' associated to the `User' model, with extra fields

   corresponding to the profile information.


class MemberForm(ModelForm):
   
# These fields map to those on the Profile model
   
# One for brevity here, but think of many more in practice
    language
= forms.CharField(
        max_length
=3,
        widget
=forms.Select(choices=Profile.LANGUAGES)
   
)


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


1. View: a `CreateView' subclass associated to the `User' model,

   overriding the `form_valid()' method in which the `Profile' model is

   populated by hand from the form's `cleaned_data' extra fields.


class MemberCreate(CreateView):
    form_class
= PanelMemberForm

   
def form_valid(self, form):
        language
= form.cleaned_data['language']
       
with transaction.atomic():
            user
= form.save()
           
Profile(user=user, language=language).save()
       
return HttpResponseRedirect(self.get_success_url())



The obvious limitation I see to this approach is that when fields are

added or modified on the `Profile' model, both the form and the view

must be carfully updated. I suspect this will not be very easily

maintained code when the `Profile' model grows…


Thanks in advance for any insights you might share (and for having read

thus far)


Quentin







--
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+unsubscribe@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/2fac50f2-6a23-4a1d-97a7-98ca388892ab%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment