Использовать значение модели для создания формы 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)