2010-12-10 20 views
2

Mon models.py:Est-il possible de passer des arguments supplémentaires ou des instances de formulaire à django formset?

class Company(models.Model): 
    company_name = models.CharField(max_length=255) 

class TimePeriod(models.Model): 
    period = models.CharField(max_length=4) 

class Unit(models.Model): 
    unit_name = models.CharField(max_length=50) 
    unit_type = models.CharField(max_length=50) 

class DataElement(models.Model): 
    data_element_name = models.CharField(max_length=50) 

class Source(models.Model): 
    source_name = models.CharField(max_length=50)  

class CompanyData(models.Model): 
    company = models.ForeignKey(Company) 
    time_period = models.ForeignKey(TimePeriod) 
    data_element = models.ForeignKey(DataElement) 
    unit = models.ForeignKey(Unit) 
    source = models.ForeignKey(Source) 
    value = models.DecimalField(max_digits=15, decimal_places=2) 

Je voudrais avoir une forme similaire à:

--company--, --time period--

  • element1 de données: - -value--, --unit--, --source--
  • données element2: --value--, --unit--, --source--
  • ...
  • données elementN: --value--, --unit--, --source--

Mon forms.py maintenant:

class CompanyTimeForm(ModelForm): 
    class Meta: 
     model = CompanyData 
     fields = ('company', 'time_period') 

class CompanyDataForm(ModelForm): 
# data_element = forms.IntegerField(widget=forms.HiddenInput()) 
# def __init__(self, extra): 
#  ... init data_element ... 
    class Meta: 
     model = CompanyData 
     fields = ('value', 'unit', 'source') 

et utilisation:

top_form = CompanyChainTimeForm(request.POST or None) 
CompanyDataFormSet = formset_factory(CompanyDataForm, extra=X) 
formset = CompanyDataFormSet() 

Est-il possible d'initialiser formset vide, puis récupérer DataElement.objects.all() et faire quelque chose de similaire à formset.add (CompanyDataForm (... DataElement.pk ...))

Ou quelle serait la meilleure option pour mon cas?

Répondre

0

Si time_period était un champ sur le Company alors, clairement, ce serait simple.

Dans l'apparence de votre formulaire, vous voulez qu'il apparaisse comme tel, même s'il ne l'est pas.

La meilleure chose serait d'abandonner le ModelForm, utilisez un Form avec un save et un formset_factory pour générer de nombreuses formes pour cela. Dans votre propre save, vous pouvez bien sûr créer une instance du TimePeriod et l'associer au Company avant de l'enregistrer.

+0

Le problème n'est pas timeperiod plutôt CompamyData.data_element. J'ai un champs communs pour tous les nouveaux enregistrements (CompanyTimeForm) et de nombreux formulaires (N = nombre d'enregistrements DataElements), qui seront enregistrés en tant que N CompanyData records (chacun aura les mêmes champs de CompanyTimeForm). Mais chacun de ces formes similaires devrait avoir caché dataelement.pk unique, que je pourrais passer à CompanyDataForm (chaînes commentées), mais en fait je ne peux pas (au moins ne sais pas comment). – Alexey

0

Il semble qu'il est impossible d'utiliser formset ici. Je l'ai fait par des formes définies avec des préfixes:

... 
data_forms = [] 
is_valid = True 
for de in DataElement.objects.all(): 
    data_form = CompanyDataForm(request.POST or None, initial={'data_element': de.pk}, value_label=de, prefix="de-%s" % de.pk) 
    if request.method == 'POST': 
     if not data_form.is_valid(): 
      is_valid = False 
    data_forms.append(data_form)