Использовать значение модели для создания формы Django

У меня есть модель, которая выглядит следующим образом:

class BloodTestType(models.Model):
    type = models.CharField(max_length=200)
    def __str__(self):
        return str(self.type)

class BloodParameters(models.Model):
    type = models.ForeignKey(BloodTestType, on_delete=models.CASCADE)
    parameter = models.CharField(max_length=200)
    minimum_value = models.FloatField()
    maximum_value = models.FloatField()
    unit = models.CharField(max_length=200)
    required = models.BooleanField(default=True)
    GENDER_CHOICES =  [
    ('B', 'Both'),
    ('M', 'Male'),
    ('F', 'Female'),
    ]
    gender = models.CharField(max_length = 100,choices = GENDER_CHOICES,default = 'B')

    def __str__(self):
        return str(self.type) + ' ' + str(self.parameter)

Считать, что модель BloodParameters имеет 3 параметра с типом = '1'

Я хочу создать Django форму, содержащую эти 3 параметра в качестве полей ввода, но форма загружается пустой. Я пытаюсь сделать что-то вроде этих строк в моем файле форм :

class BloodReportCBCIronForm(forms.Form):
    cbc_iron_parameters = BloodParameters.objects.filter(type = 1)
    print('asd')
    print(cbc_iron_parameters.__dict__)
    for each in cbc_iron_parameters:
        each.parameter = forms.CharField(label = each.parameter,max_length = 80,required = True,)

Вы хотите динамически добавлять поля в форму, и место для этого находится внутри метода формы __init__. Например, так:

from django import forms
from django.utils.text import slugify


class BloodReportCBCIronForm(forms.Form):
    def __init__(self, type, *args, **kwargs):
        """
        Initializes a form with a dynamic set of fields, based upon objects fetched from the database.        
        :param type: integer ID of a BloogTestType object 
        :param args: 
        :param kwargs: 
        """
        cbc_iron_parameters = BloodParameters.objects.filter(type__id=type)

        for each in cbc_iron_parameters:
            # Safety-check here, in case the each.parameter value contains spaces or symbols.
            field_name = slugify(each.parameter)
            # Add a field to the self.base_fields dictionary. Note that this doesn't deal 
            # with the scenario where there are multiple parameters with the same name.
            self.base_fields[field_name] = forms.CharField(label=each.parameter, max_length=80, required=True)

        # super() will now create fields based off of whatever you added to the self.base_fields dictionary.
        super().__init__(*args, **kwargs)

Затем, чтобы инициализировать и использовать форму, вам нужно сделать примерно следующее:

form = BloodReportCBCIronForm(type=1)
Вернуться на верх