是否可以将其他参数或表单实例传递给django formset?

时间:2010-12-10 10:12:16

标签: django django-forms

我的models.py:

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)

我希望形式类似于:

- 公司 - , - 时间段 -

  • data element1: - value - , - unit - , - sources -
  • data element2: - value - , - unit - , - sources -
  • ...
  • 数据元素N: - value--, - unit--, - sources -

我的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()并使类似于 formset.add(CompanyDataForm(... DataElement.pk ...))

或者对我来说最好的选择是什么?

2 个答案:

答案 0 :(得分:0)

如果time_period是Company上的一个字段,那么显然它会很直接。

在表单的外观中,您希望将其显示为这样,即使它不是。

最好的办法是抛弃ModelForm,使用Form saveformset_factory来生成许多表单。在您自己的save中,您当然可以创建TimePeriod的实例,并在实际保存之前与Company相关联。

答案 1 :(得分: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)