jarbinks
jarbinks

Reputation: 23

ModelForm object has no attribute 'fields'

I am using a django (3.0) ModelMultipleChoice field for a form. I am trying to modify the queryset to make some restrictions on it.

here is the views :

def nouvelle_tache(request,id_livrable):
    livrable=Livrable.objects.get(pk=id_livrable)
    projet = livrable.projet
    if request.method == "POST":
        form = NouvelleTache(request.POST,projet=projet)
        tache = form.save(commit=False)
        tache.livrable = livrable
        tache.id_tache = livrable.id_derniere_tache() + Decimal(0.01)
        tache.save()
        form.save_m2m()
        etat = Temps_etat_tache(etat=form.cleaned_data['etat_initial'],tache=tache)
        etat.save()
        return redirect('tache',tache.pk)
    else:
        form = NouvelleTache(projet=projet)
    return render(request, 'application_gestion_projets_AMVALOR/nouvelle_tache.html', locals())

And the forms :

class NouvelleTache(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        projet = kwargs.pop('projet', None)
        queryset = Utilisateur.objects.all()
        for utilisateur in projet.utilisateurs:
            queryset = queryset.exclude(pk=utilisateur.pk)
        self.fields['ressources'].queryset = queryset
        super(NouvelleTache, self).__init__(*args, **kwargs)
        
    ressources= forms.ModelMultipleChoiceField(queryset=Utilisateur.objects.all() ,widget =forms.CheckboxSelectMultiple )
    etat_initial = forms.ModelChoiceField(queryset=Etat_tache.objects.none())
    class Meta:
        model = Tache
        fields  = ['libelle']

I have the followig error : 'NouvelleTache' object has no attribute 'fields'

I don't understand why because many other users seems to have similar code and it works.

Any help would be appreciate.

Upvotes: 1

Views: 1902

Answers (1)

Horatiu Jeflea
Horatiu Jeflea

Reputation: 7404

super(NouvelleTache, self).__init__(*args, **kwargs)

needs to be executed first, as the fields are set in the super class:

def __init__(self, *args, **kwargs):
    projet = kwargs.pop('projet', None)
    queryset = Utilisateur.objects.all()
    for utilisateur in projet.utilisateurs:
        queryset = queryset.exclude(pk=utilisateur.pk)
    super(NouvelleTache, self).__init__(*args, **kwargs)
    self.fields['ressources'].queryset = queryset

Upvotes: 1

Related Questions