我的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)
我希望形式类似于:
- 公司 - , - 时间段 -
我的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 ...))
或者对我来说最好的选择是什么?
答案 0 :(得分:0)
如果time_period是Company
上的一个字段,那么显然它会很直接。
在表单的外观中,您希望将其显示为这样,即使它不是。
最好的办法是抛弃ModelForm
,使用Form
save
和formset_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)