2010-12-10 46 views
2

我的models.py:是否可以將其他參數或表單實例傳遞給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) 

我想有類似的形式:

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

  • 數據元素1: - -value--,--unit--,--source--
  • 數據在element2:--value--,--unit--,--source--
  • ...
  • 數據elementN:--value--,--unit--,--source--

我現在forms.py:

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

與用法:

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

是否有可能初始化空的formset,然後獲取DataElement.objects.all()並做出類似於10或者對我的情況最好的選擇是什麼?

回答

0

如果time_period是Company上的字段,那麼顯然它會很簡單。

在表單的外觀中,您希望使其看起來像這樣,即使它不是。

的最好的事情是溝ModelForm,使用Formsaveformset_factory產生這許多的形式。在您自己的save中,當然您可以在實際保存之前創建TimePeriod的實例並與Company關聯。

+0

問題不TIMEPERIOD而CompamyData.data_element。對於每個新記錄(CompanyTimeForm)和許多(N = DataElements記錄數)類似的表單,我都有一個共同字段,它們將作爲N個CompanyData記錄(每個記錄都具有與CompanyTimeForm相同的字段)保存。但是每個來自這個類似的表單都應該有獨特的隱藏dataelement.pk,我可以傳遞給CompanyDataForm(註釋的字符串),但實際上我不能(至少不知道如何)。 – Alexey 2010-12-10 10:33:39

0

這似乎是不可能在這裏使用formset。 我已經通過與前綴設置形式做到了:

... 
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) 
相關問題