Как я могу отфильтровать значения из одной модели и вставить результат в форму в качестве вариантов выбора?

Добрый день!

У меня есть две таблицы - модели. Я заполняю их постепенно. Сначала у меня есть первая таблица. Сначала я ввожу данные в первую таблицу.

И там - в первой таблице, которая у меня есть - повторяющиеся данные. Поле - (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.

Вернуться на верх