2010-12-10 8 views
2

Mein models.py:Ist es möglich, zusätzliche Argumente oder Formularinstanzen an Django Formset zu übergeben?

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) 

Ich möchte Form haben ähnlich wie:

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

  • Daten element1: - -value--, --unit--, --source--
  • Daten element2: --value--, --unit--, --source--
  • ...
  • Daten elementN: --value--, --unit--, --source--

Mein forms.py jetzt:

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') 

und Nutzung:

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

Ist es möglich, leeres Formset zu initialisieren, dann holen Sie DataElement.objects.all() und machen Sie etwas ähnlich formset.add (CompanyDataForm (... DataElement.pk ...))

Oder was wäre die beste Option für meinen Fall?

Antwort

0

Wenn time_period war ein Feld auf der Company dann, klar es wäre einfach.

Im Aussehen Ihres Formulars möchten Sie es als solches erscheinen lassen, auch wenn dies nicht der Fall ist.

Das Beste wäre es, die ModelForm zu Graben, verwenden Sie einen Form mit einem save und ein formset_factory zu viele Formen für das erzeugen. Innerhalb Ihrer eigenen save können Sie natürlich eine Instanz der TimePeriod erstellen und mit der Company verknüpfen, bevor Sie es tatsächlich speichern.

+0

Das Problem ist nicht Timeperiod ist eher CompamyData.data_element. Ich habe ein gemeinsames Feld für alle neuen Datensätze (CompanyTimeForm) und viele (N = Anzahl von DataElements-Datensätzen) ähnlichen Formularen, die als N CompanyData-Datensätze gespeichert werden (jeder hat die gleichen Felder von CompanyTimeForm). Aber jeder von diesen ähnlichen Formen sollte ein einzigartiges verstecktes Datenelement.pk haben, das ich an CompanyDataForm übergeben konnte (Kommentarzeichenfolgen), aber eigentlich kann ich nicht (weiß zumindest nicht wie). – Alexey

0

Es scheint, dass es hier unmöglich ist, Formset zu verwenden. Ich habe es getan über Vordrucke mit Präfixen:

... 
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) 
Verwandte Themen