Как я могу отфильтровать значения из одной модели и вставить результат в форму в качестве вариантов выбора?
Добрый день!
У меня есть две таблицы - модели. Я заполняю их постепенно. Сначала у меня есть первая таблица. Сначала я ввожу данные в первую таблицу.
И там - в первой таблице, которая у меня есть - повторяющиеся данные. Поле - (name_object) - повторяется и может содержать одни и те же строки. Также еще более повторяющееся поле - name_working.
Я планирую включить отфильтрованные значения (name_working) во вторую форму.
Как я могу отфильтровать значения в таблице моделей - CreateNewGPR по - (name_object) - который похож на pk .
И вставьте полученные данные в форму в качестве select или вариантов выбора .
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)
Вам нужно подойти к этому по-другому - вам следует рассмотреть возможность обновления ваших моделей с помощью наследования. Смотрите Наследование с несколькими таблицами.
Это будет выглядеть следующим образом:
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="Дата")
Затем, когда вы используете ModelForm для CreteNewWorkDay, Django автоматически создаст сопутствующий объект CreateNewGPR для каждого объекта CreateNewWorkDay.
В качестве альтернативы, вы можете захотеть использовать OneToOneField для CreateNewWorkDay, который указывает на экземпляр CreateNewGPR - это делает обе модели отдельными (не родительскими/дочерними), но связывает их с помощью ForeignKey.