是否可以将其他参数或表单实例传递给django formset?
问题描述:
我的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或者对我的情况最好的选择是什么?
答
如果time_period是Company
上的字段,那么显然它会很简单。
在表单的外观中,您希望使其看起来像这样,即使它不是。
的最好的事情是沟ModelForm
,使用Form
与save
和formset_factory
产生这许多的形式。在您自己的save
中,当然您可以在实际保存之前创建TimePeriod
的实例并与Company
关联。
答
这似乎是不可能在这里使用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)
问题不TIMEPERIOD而CompamyData.data_element。对于每个新记录(CompanyTimeForm)和许多(N = DataElements记录数)类似的表单,我都有一个共同字段,它们将作为N个CompanyData记录(每个记录都具有与CompanyTimeForm相同的字段)保存。但是每个来自这个类似的表单都应该有独特的隐藏dataelement.pk,我可以传递给CompanyDataForm(注释的字符串),但实际上我不能(至少不知道如何)。 – Alexey 2010-12-10 10:33:39