Django набор форм для всех вариантов выбора в данном поле модели с предварительно заполненными значениями для поля выбора
У меня есть модель следующего вида:
AGE_GROUPS = (
('<1', '<1'),
('1-4', '1-4'),
('5-9', '5-9'),
('10-14', '10-14'),
('15-19', '15-19'),
('20-24', '20-24'),
('25-29', '25-29'),
('30-34', '30-34'),
('35-39', '35-39'),
('40-44', '40-44'),
('45-49', '45-49'),
('50+', '50+'),
)
class Data(models.Model):
dataset = models.ForeignKey('data.Dataset', on_delete=models.CASCADE)
indicator = models.ForeignKey('data.Indicator', on_delete=models.CASCADE)
facility = models.CharField(max_length=120, choices=FACILITIES)
month = models.CharField(max_length=20)
age_group = models.CharField(max_length=10, choices=AGE_GROUPS)
male = models.PositiveIntegerField(blank=True, null=True)
female = models.PositiveIntegerField(blank=True, null=True)
А также форма и набор форм следующим образом:
class DataForm(forms.ModelForm):
class Meta:
model = Data
fields = ['age_group', 'male', 'female']
DataFormset = forms.modelformset_factory(Data, form=DataForm, extra=len(AGE_GROUPS))
В этом и заключается проблема:
В шаблоне я хочу, чтобы набор форм отображался в виде таблицы для всех возрастных групп с предварительно заполненными возрастными группами. Еще лучше, есть ли способ сделать возрастную группу нередактируемым столбцом, а мужской и женский - редактируемыми? Учтите, что если конкретная запись уже имеет значения (для мужского и женского пола), то соответствующая строка набора форм также должна быть предварительно заполнена
Вот мое мнение на данный момент:
def home(request):
data_formset = DataFormset(request.POST or None)
# -> The below code is not working when the model has existing data
# (I'm open to any approach)
# Prefill the Age Groups in the formset
# for i, form in enumerate(data_formset):
# if form.fields['age_group'] == None:
# form.fields['age_group'].initial = AGE_GROUPS[i][0]
# Handle POST Request
if request.method == 'POST':
if data_formset.is_valid():
for record in data_formset.cleaned_data:
data = Data.objects.create(
# ... other logic to handle the other fields in the model
**record
)