2

As I'm learning Django Class Based View (CBV) in order to handle my script developed in Function Based View (FBV), I would like to make the following process.

I would like to prepopulate one Django form field based on self.request.GET.

This is my class :

class IdentitySocieteFormView(LoginRequiredMixin, CreateView) :

    form_class = SocieteFormulaire
    template_name = 'Identity_Societe_Form.html'
    model = Societe

    def get_context_data(self, **kwargs) :

        data = super(IdentitySocieteFormView, self).get_context_data(**kwargs)

        if 'recherche' in self.request.GET :

            query_Responsable = self.request.GET.get('Responsable') 
            Responsable = Individu.objects.filter(NumeroIdentification=query_Responsable)

            data['responsable'] = Responsable

        return data

    def form_valid(self, form) :

        form.instance.Reponsable = responsable
        form.instance.Utilisateur = self.request.user.last_name + " " + self.request.user.first_name

        return super(IdentitySocieteFormView, self).form_valid(form)

But I'm not sure about this line : form.instance.Reponsable = responsable which let to repopulate my field.

Previously, my script looked like this :

@login_required
def IdentitySocieteForm(request) :

    query_Responsable = request.GET.get('Responsable') 

    success = False

    if request.method == 'POST':

        form = SocieteFormulaire(request.POST or None)

        if form.is_valid() :   # Vérification sur la validité des données
            post = form.save()

            messages.success(request, 'Le formulaire a été enregistré !')
            return HttpResponseRedirect(reverse('SocieteResume', kwargs={'id': post.id}))

        else:
            messages.error(request, "Le formulaire est invalide !")

    else:
        form = SocieteFormulaire()

        Responsable = Individu.objects.filter(NumeroIdentification=query_Responsable)
        form.fields['Responsable'].queryset = Responsable
        form.fields['Utilisateur'].initial = request.user.last_name + " " + request.user.first_name

    return render(request, 'Identity_Societe_Form.html', {"form" : form, "query_Responsable" : query_Responsable})

Thank you by advance if you can help me

EDIT :

I tried get_initial() :

def get_initial(self):

        initial = super(IdentitySocieteFormView, self).get_initial()

        if 'recherche' in self.request.GET :

            query_Responsable = self.request.GET.get('Responsable')
            Responsable = Individu.objects.filter(NumeroIdentification=query_Responsable)
            initial['Responsable'].queryset = Responsable

        return initial

But I get :

File "/Users/valentinjungbluth/Desktop/Django/DatasystemsCORE/DatasystemsCore/DatasystemsCORE/Identity/views.py" in get_initial
  227.             initial['Responsable'].queryset = Responsable

Exception Type: KeyError at /Identification/Company/Form/
Exception Value: 'Responsable'

My forms.py looks like this :

class SocieteFormulaire(forms.ModelForm) :

    Responsable = CustomLabelModelChoiceField(Individu.objects.filter(), required=False, label = "Responsable", label_func=lambda obj: '%s %s %s' % (obj.Nom, obj.Prenom, obj.NumeroIdentification))
    InformationsInstitution = forms.CharField(widget=forms.HiddenInput(), initial=InformationsInstitution.objects.using('default').last().Ville.encode('utf-8'))

    class Meta :
        model = Societe
        fields = [
                'Nom',
                'Etat', 
                'Adresse', 
                'Ville', 
                'Zip', 
                'Region',
                'Pays', 
                'Mail',
                'Web',
                'Telephone',
                'Fax',
                'SIREN',
                'SIRET',
                'NAF_APE',
                'RCS',
                'CHOIX_TVA',
                'TVA',
                'Type',
                'Effectif',
                'Domaine', 
                'Capital',
                'Responsable',
                'InformationsInstitution',]
Essex
  • 6,042
  • 11
  • 67
  • 139

1 Answers1

5

follow by the filtering-a-model-in-a-createview-with-get-queryset

update method to get_form_kwargs

def get_form_kwargs(self):
    kwargs = super(IdentitySocieteFormView, self).get_form_kwargs()
    query_Responsable = self.request.GET.get('Responsable')
    Responsable = Individu.objects.filter(NumeroIdentification=query_Responsable)
    kwargs['responsable_qs'] = Responsable
    u = request.user
    kwargs['user_initial'] = '{lname} {fname}'.format(lname=u.last_name, fname=u.first_name)
    return kwargs

in form

class SocieteFormulaire(forms.ModelForm):
    def __init__(self, *args, **kwargs):
       user_initial = kwargs.pop('user_initial', None)
       responsable_qs = kwargs.pop('responsable_qs', None)
       super(SocieteFormulaire, self).__init__(*args, **kwargs)
       self.fields['Responsable'].queryset = responsable_qs
       self.fields['InformationsInstitution'].initial = user_initial
Essex
  • 6,042
  • 11
  • 67
  • 139
Brown Bear
  • 19,655
  • 10
  • 58
  • 76