Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Gérer l'inscription avec des champs uniques

+1 vote

Je dispose d'un modèle utilisateur que j'ai changé avec la donnée unique qui désormais est l'email.
Un utilisateur n'a qu'un seul profil mais dispose de plusieurs profil joueurs ou coachs qui sont rattachés à lui.
Lors de l'ajout d'un joueur ou d'un coach, je crées un nouvel utilisateur et un nouveau joueur que je rattachent entre eux.
Le problème est lorsque qu'un email est déjà utilisé je voudrais juste récupérer le profil de l'utilisateur, créer le profil joueur ou coach et enfin les liéer entre eux.
J'utilise pour ca la méthode getorcreate() sauf que le champs email de mon profil utisateur est unique du coup j'ai un problème lors de la validation des formulaires.

Je ne sais donc pas comment faire ca.

class CoachCreateView(WithSectionMixin, CreateView):
"""Create a coach
"""

model = MyUser
form_class = MyUserForm
template_name = "staffManagement/coach_create.html"



def get(self, request, *args, **kwargs):

    self.object = None
    form_class = self.get_form_class()
    form = self.get_form(form_class)
    coach_item_form = CoachForm()
    return self.render_to_response(self.get_context_data(form = form,
        coach_item_form = coach_item_form))

def post(self, request, *args, **kwargs):

    self.object = None
    form_class = self.get_form_class()
    form = self.get_form(form_class)
    coach_item_form = CoachForm(self.request.POST)

    if form.is_valid() and coach_item_form.is_valid():
        return self.form_valid(form, coach_item_form)
    else:
        return self.form_invalid(form, coach_item_form)

def form_valid(self, form, coach_item_form):
    obj, created = MyUser.objects.get_or_create(
            email=form.cleaned_data.get('email'),
            )

    # If obj was created
    if (created):
        print ("created")
        # Python 2
        #salt = os.urandom(2).encode('hex')
        # Python 3.5
        salt = os.urandom(2).hex()

        username = str(form.cleaned_data.get('last_name') +
                form.cleaned_data.get('first_name') + salt)
        obj.username = username
        obj.save()

    coach = coach_item_form.save(commit=False)
    coach.member = obj
    coach.section = self.get_section()
    coach.save()

    return HttpResponseRedirect(self.get_success_url())

def form_invalid(self, form, coach_item_form):
    return self.render_to_response(self.get_context_data(form = form,
        coach_item_form = coach_item_form))

def get_success_url(self):
    return reverse_lazy('playerAndCoachInSection',
            kwargs={'team':self.get_team(), 'section':self.get_section()})
demandé 27-Sep-2016 par Echel8n (246 points)

1 Réponse

0 votes

Dans ton form, override le save() pour verifier si une instance existe, et si c'est le cas l'utiliser.

répondu 4-Oct-2016 par Sam (4,958 points)
...