Is it possible to pass additional arguments or form instances to django formset?
My 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)
I'd like to have form similar to:
--company--, --time period--
- data element1: --value--, --unit--, --source--
- data element2: --value--, --unit--, --source--
- ...
- data elementN: --value--, --unit--, --source--
My forms.py now:
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')
and usage:
top_form = CompanyChainTimeForm(request.POST or None)
CompanyDataFormSet = formset_factory(CompanyDataForm, extra=X)
formset = CompanyDataFormSet()
Is it possible to initialize empty formset, then fetch DataElement.objects.all() and make something similar to formset.add(CompanyDataForm(...DataElement.pk...))
Or what would be the best option for my case?
If time_period was a field on the Company
then, clearly it would be straight forward.
In the appearance of your form, you want to make it appear as such, even though it isn't.
The best thing would be to ditch the ModelForm
, use a Form
with a save
and a formset_factory
to generate many forms for that. Within your own save
, of course you can create an instance of the TimePeriod
and associate with the Company
before you actually save it.
It seems as it's impossible to use formset here. I've done it via forms set with prefixes:
...
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)
精彩评论