Django-fr

Forum

#1 16-05-2013 13:04:55

torrak
Membre
Inscription : 31-08-2011
Messages : 47

[RESOLU] Initialisation d'un formset et curry

Bonjour,

On prend a peu près les mêmes que dans le POST précédent et on recommence. J'ai un problème au moment de l'initialisation d'un model formset.
En effet, je souhaite faire à peu près la même chose que dans ce post mais à l'échelle d'un formset.

Voici mon code:

class InvitForm(BaseModelFormSet):
    
    def __init__(self, event = None, *args, **kwargs):
        super(InvitForm, self).__init__(*args, **kwargs)
        self.event = event
        if self.event != None:
            self.evente = evenement.objects.get(id = self.event)
            self.lieu = Lieux.objects.get(id = self.evente.Lieu.id)
            self.scenes = [x.id for x in self.lieu.scene_set.all()]
            for form in self.forms:
                form.fields['Scene'].queryset = scene.objects.filter(id__in = self.scenes)
        else:
            for form in self.forms:
                form.fields['Scene'].queryset = scene.objects.all()

InvitFormSet = modelformset_factory(invitEvtGrp, extra = 0, formset = InvitForm, fields=('idGrpArtDest', 'DateConvoc', 'OrdrePass', 'Objet', 'Contenu', 'e_mail', 'Scene' ))
InvitFormSet.form = staticmethod(curry(InvitForm, event=Event.id))

Voici mon erreur:

Environment:


Request Method: GET
Request URL: http://xxxxxxxxxxxxxxxxxx/xxxxxxx/xxxxxx/xxxxxxxxxx/xxxxxxxxxxxxxx/

Django Version: 1.4
Python Version: 2.6.6
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django_extensions',
 'xxxxxxxxxxxx',
 'django.contrib.admin',
 'django.contrib.gis',
 'django.contrib.admindocs')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "/usr/local/alwaysdata/python/django/1.4/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home//xxxxxxxxxxxxx/xxx/xxxxxxx/views.py" in EventModif
  1281.         InvitFormSet = InvitFormSet(queryset = InvitGroupes)
File "/home/xxxxxxxxxxxxx/xxx/xxxxxxx/views.py" in __init__
  1138.         super(InvitForm, self).__init__(*args, **kwargs)
File "/usr/local/alwaysdata/python/django/1.4/django/forms/models.py" in __init__
  424.         super(BaseModelFormSet, self).__init__(**defaults)
File "/usr/local/alwaysdata/python/django/1.4/django/forms/formsets.py" in __init__
  50.         self._construct_forms()
File "/usr/local/alwaysdata/python/django/1.4/django/forms/formsets.py" in _construct_forms
  115.             self.forms.append(self._construct_form(i))
File "/usr/local/alwaysdata/python/django/1.4/django/forms/models.py" in _construct_form
  458.         return super(BaseModelFormSet, self)._construct_form(i, **kwargs)
File "/usr/local/alwaysdata/python/django/1.4/django/forms/formsets.py" in _construct_form
  134.         form = self.form(**defaults)
File "/usr/local/alwaysdata/python/django/1.4/django/utils/functional.py" in _curried
  11.         return _curried_func(*(args+moreargs), **dict(kwargs, **morekwargs))
File "/home/xxxxxxxxxxxxx/xxx/xxxxxxx/views.py" in __init__
  1138.         super(InvitForm, self).__init__(*args, **kwargs)
File "/usr/local/alwaysdata/python/django/1.4/django/forms/models.py" in __init__
  424.         super(BaseModelFormSet, self).__init__(**defaults)

Exception Type: TypeError at /event/mod/1576/xxxxxxxxxxxxx/
Exception Value: __init__() got an unexpected keyword argument 'instance'

voilà, si quelqu'un peut me filer un petit coup de main, merci.

Hors ligne

#2 17-05-2013 06:29:47

Xavier Ordoquy
Administrateur
Lieu : Puteaux, France
Inscription : 12-10-2011
Messages : 312
Site Web

Re : [RESOLU] Initialisation d'un formset et curry

Bonjour,

La notation d'un InvitForm qui est un FormSet et non un Form introduit une certaine confusion.

L'idée de base avec le curry était de préparer le formulaire directement avec un argument supplémentaire et non le formset.
En conséquence, je pense que la ligne ci-dessous doit être modifiée pour que le InvitForm (qui est une formset) soit remplacé par la classe du formulaire que tu utilises dans InvitForm.

InvitFormSet.form = staticmethod(curry(InvitForm, event=Event.id))

Hors ligne

#3 17-05-2013 09:26:34

torrak
Membre
Inscription : 31-08-2011
Messages : 47

Re : [RESOLU] Initialisation d'un formset et curry

Bonjour,

Merci pour la réponse,

Mais le problème d'après ce que je comprends est que j'instancie le "modelformset_factory" avec  "invitEvtGrp" qui n'est pas un "form" mais un "model", donc au final je ne sais pas comment accéder à l'instance "form" du "model" associé au "modelformset_factory".

Bref, je ne comprend toujours pas....

Si vous avez une explication, Xavier, je serais ravi de vous lire.

Cordialement

Dernière modification par torrak (17-05-2013 10:02:37)

Hors ligne

#4 17-05-2013 18:02:12

torrak
Membre
Inscription : 31-08-2011
Messages : 47

Re : [RESOLU] Initialisation d'un formset et curry

Bonjour,

En réorganisant  mon code et en faisant un "modelform" j'obtiens le résultat attendu,

Voici mon code:

class InvitForm(ModelForm):
    
    class Meta:
        model = invitEvtGrp
        
    def __init__(self, event = None, *args, **kwargs):
        .....
        etc...


InvitFormSet = modelformset_factory(invitEvtGrp , form = InvitForm, extra = 0, max_num = InvitGroupes.count())
InvitFormSet.form = staticmethod(curry(InvitForm, event=Event.id))

Merci Xavier Ordoquy pour vos explications.

Ce post peut être considéré comme résolu.

Hors ligne

Pied de page des forums