dszczyt/django-nested-forms — Issue #1: formulaires imbriqués et relation avec une table through
Author: frague59
Created: 2011-10-11 09:12:26+00:00
State: open

Bonjour,

Ton boulot sur les nested_forms est très inintéressant, mais...

J'ai un petit soucis avec, je t'explique :

Voici mes modèles :
code:
class FournitureArticle(models.Model):
'''
Articles de fournitures
'''
class Meta:
ordering = ('label',)
verbose_name = u'Article de fourniture'
verbose_name_plural = u'Articles de fourniture'

label = models.CharField(name='label',
verbose_name=u"Libellé",
max_length=256,)

def __unicode__(self):
return self.label

class FournitureDemande(Demande):
'''
Demande de fourniture d'articles
'''
class Meta:
verbose_name = u'Demande de fourniture'
verbose_name_plural = u'Demandes de fourniture'
permissions = (('directeur_view_fournituredemande', 'DIR - Voir les demandes de fournitures'),
('directeur_add_fournituredemande', 'DIR - Ajouter une demande de fournitures'),
('directeur_change_fournituredemande', 'DIR - Modifier une demande fournitures'),
('gest_valid_fournituredemande', 'GEST - Valider une demande de fournitures'),)

articles = models.ManyToManyField(FournitureArticle,
name='articles',
verbose_name=u'articles',
through='FournitureArticleDemande',
related_name='fourniturearticle_fournituredemande',)
def __unicode__(self):
return 'Demande de fournitures du %s' % (self.date.strftime('%d %M %Y'))

class FournitureArticleDemande(models.Model):
'''
Table de relation entre les demandes de fournitures et les articles.
'''

demande = models.ForeignKey('FournitureDemande',
name='fourniture_demande', verbose_name=u'Demande',
related_name='fourniture_demande_fourniturearticledemande',)

article = models.ForeignKey('FournitureArticle',
name='fourniture_article', verbose_name=u'Article',
related_name='fourniture_article_fourniturearticledemande',)

quantite = models.IntegerField(name='quantite', verbose_name=u'Quantité',
default=0,)

def __unicode__(self):
return '%s : %s pièce(s)' % (self.article, self.quantite)

Je souhaite faire un formlaire, mais en utilisant le modèle défini dans le 'through' : FournitureArticleDemande comme formulaire 'nested', c'est à dire qu'à l'affichage j'ai un choix d'articles et une quantité saisir.

Pour le moment, j'ai la possibilité d'ajouter une ligne dans la table des articles. Voici le code de mes formulaires :
code:
def get_choice_article(demande):
class FournitureArticleDemandeForm(forms.ModelForm):
class Meta:
model = models.FournitureArticleDemande
fields = ('article', 'quantite',)
exclude = ('demande',)

def save(self, commit=True):
instance = super(FournitureArticleDemandeForm, self).save(commit=False)
instance.demande = demande
logger.debug('FournitureArticleDemandeForm::save() instance = %s' % (instance))
logger.debug('FournitureArticleDemandeForm::save() demande = %s' % (demande))
if commit:
instance.save()
self.save_m2m()
return instance

return FournitureArticleDemandeForm

class FournitureDemandeArticlesForm(nested_forms.ThroughComplexModelForm):
class Meta:
model = models.FournitureDemande
fieldsets =
widgets = dict(DEMANDE_READONLY_WIDGETS)
exclude = ('articles', 'date_reponse', 'statut', 'motif',)

formsets = {'articles': {'form': lambda instance: get_choice_article(instance),
'extra': 1,
'initial':[{'quantite': 0, }],
}}

(les lignes sont décalées à droite à l'affichage ^^, mais elles sont bien indentées dans la vraie vie ;) )
Je développe sur django 1.3.x, et j'use et abuse des 'class-based generic views' (qui sont vachement cool si tu connais pas..)

Merci d'avance !

frague