2010-12-10 38 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) 
相关问题