How can I filter values from one model and insert the result into the form as choices?
Good day!
I have two tables - models. I fill them gradually. First I have the first table. First I enter data into the first table.
And there - in the first table I have - repeating data. Field - (name_object) - is repeated and can have the same rows. Also even more repeated field - name_working.
I plan to include filtered values (name_working) in the second form.
How can I filter values in the model table - CreateNewGPR by - (name_object) - which is like pk .
And insert the received data into the form as select or choices .
models.py
class CreateNewGPR (models.Model):
name_object = models.IntegerField(verbose_name="Наименование объекта")
name_working = models.CharField(verbose_name="Наименование работы")
type_izm = models.CharField(choices=TYPE_IZMERENIYA, verbose_name="Единицы измерения")
value_work = models.FloatField(verbose_name="Объём работ")
lyudi_norma = models.IntegerField(verbose_name="Нормативные затраты персонала")
technik_norma = models.IntegerField(verbose_name="Нормативные затраты техники")
date_begin = models.DateField(verbose_name="Дата начала работ")
date_end = models.DateField(verbose_name="Дата окончания работ")
class CreateNewWorkDay (models.Model):
name_object = models.IntegerField(verbose_name="Наименование объекта")
name_working = models.CharField(verbose_name="Наименование работы по ГПР")
second_name_working = models.CharField(verbose_name="Фактическое наименование работы")
third_name_working = models.TextField(verbose_name="Описание работы")
type_izm = models.CharField(choices=TYPE_IZMERENIYA, verbose_name="Единицы измерения")
value_work_fact = models.FloatField(verbose_name="Объём работ фактический")
lyudi_norma = models.IntegerField(verbose_name="Нормативные затраты персонала")
technik_norma = models.IntegerField(verbose_name="Нормативные затраты техники")
lyudi_fact = models.IntegerField(verbose_name="Фактические затраты персонала")
technik_fact = models.IntegerField(verbose_name="Фактические затраты техники")
date_day = models.DateField(verbose_name="Дата")
forms.py
class FormOne (forms.ModelForm):
class Meta:
model = ArkiObject_1
fields = "__all__"
widgets = {
"date_contract": forms.DateInput(attrs={"class":"form-control", "type":"date"})
}
class Form_GPR (forms.ModelForm):
class Meta:
model = CreateNewGPR
fields = "name_working", "type_izm", "value_work", "lyudi_norma", "technik_norma", "date_begin", "date_end"
widgets = {
"date_begin": forms.DateInput(attrs={"class":"form-control", "type":"date"}),
"date_end": forms.DateInput(attrs={"class":"form-control", "type":"date"})
}
class Form_Working (forms.ModelForm):
name_object = forms.ModelChoiceField(queryset=CreateNewGPR.objects.none())
class Meta:
model = CreateNewWorkDay
fields = "second_name_working", "third_name_working", "value_work_fact", "lyudi_fact", "technik_fact", "date_day"
widgets = {
"date_day": forms.DateInput(attrs={"class":"form-control", "type":"date"})
}
def __init__(self, *args, **kwargs):
name_working_instance = kwargs.pop('name_working_instance', None) # Get name_working_instance from kwargs
super().__init__(*args, **kwargs)
if name_working_instance:
self.fields['name_object'].queryset = CreateNewGPR.objects.filter(name_working=name_working_instance)
class FilterForm(forms.Form):
name = forms.CharField()
views.py
def create_book(request):
if request.method == 'POST':
form = Form_GPR(request.POST)
if form.is_valid():
# Process the form data
form.save()
else:
name_object_instance = Genre.objects.get(name_object_instance='You Name') # Example: Get instance
form = Form_GPR(name_working_instance=name_working_instance)
You need to approach this differently - you should consider updating your models with inheritance. See multi-table inheritance.
This would look like:
class CreateNewGPR (models.Model):
name_object = models.IntegerField(verbose_name="Наименование объекта")
name_working = models.CharField(verbose_name="Наименование работы")
type_izm = models.CharField(choices=TYPE_IZMERENIYA, verbose_name="Единицы измерения")
value_work = models.FloatField(verbose_name="Объём работ")
lyudi_norma = models.IntegerField(verbose_name="Нормативные затраты персонала")
technik_norma = models.IntegerField(verbose_name="Нормативные затраты техники")
date_begin = models.DateField(verbose_name="Дата начала работ")
date_end = models.DateField(verbose_name="Дата окончания работ")
class CreateNewWorkDay (CreateNewGPR): # <---
second_name_working = models.CharField(verbose_name="Фактическое наименование работы")
third_name_working = models.TextField(verbose_name="Описание работы")
value_work_fact = models.FloatField(verbose_name="Объём работ фактический")
lyudi_fact = models.IntegerField(verbose_name="Фактические затраты персонала")
technik_fact = models.IntegerField(verbose_name="Фактические затраты техники")
date_day = models.DateField(verbose_name="Дата")
Then, when you use a ModelForm
for CreteNewWorkDay
, Django will automatically create an accompanying CreateNewGPR
object for every CreateNewWorkDay
object.
Alternatively, you may want to use a OneToOneField
for CreateNewWorkDay
that points to an instance of CreateNewGPR
- this makes both models separate (not parent/child) but links them with a ForeignKey
.