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

После выполнения некоторых фильтров и операций я записываю данные в модель.

Я получаю данные после обработки в модели. Затем я выгружаю данные при отображении формы.

В форме есть поле, похожее на поле выбора. Но я не совсем уверен в правильности написания этой формы.

Моя проблема в том, что я могу отобразить данные для поля выбора только после некоторой обработки или в результате получения данных из другой модели.

Моя задача - выгрузить данные из другой модели в код. А затем из кода отправить их в поле выбора. Как я могу сделать что-то подобное?

models.py

class Category_pk_for_form_maim (models.Model):
    categoty_name = models.CharField()
    def __str__(self):
        return self.categoty_name
    

class Category_pk_for_form_category (models.Model):
    name_object = models.IntegerField(verbose_name="Наименование объекта")
    category_name = models.CharField()

 
class CreateNewGPR (models.Model):
    name_object = models.IntegerField(verbose_name="Наименование объекта")
    name_category = models.CharField(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 GPRWorkingName (models.Model):
    name_working = models.CharField(verbose_name="Наименование работы по ГПР")  
    def __str__(self):
        return self.name_working   

forms.py

class Form_GPR (forms.ModelForm):
    class Meta:
        model = CreateNewGPR
        fields = "name_category", "name_working", "type_izm", "value_work", "lyudi_norma", "technik_norma", "date_begin", "date_end"
        widgets = {
            "name_category": forms.RadioSelect(attrs={"type":"radio"}),
            "date_begin": forms.DateInput(attrs={"class":"form-control", "type":"date"}),
            "date_end": forms.DateInput(attrs={"class":"form-control", "type":"date"}),
            
        }

views.py

def book(request, pk):

    context = {}

    Category_pk_for_form_maim.objects.all().delete()

    filter_qs_category = Category_pk_for_form_category.objects.filter(name_object=pk)
    filter_qs_category = filter_qs_category.values("category_name")

    for item in filter_qs_category:
        entry = item
        new_entry = Category_pk_for_form_maim(categoty_name=entry)
        new_entry.save()

    form_category_1 = Category_pk_for_form_category_Form()
    form_2 = Form_GPR()

    choises_1 = Category_pk_for_form_maim.objects.all()
    choises_1 = choises_1.values_list("categoty_name", flat=True)

    choises_1 = choises_1.values()

    print(choises_1)


    form_2.fields["name_category"].choices = choises_1

    if request.method == 'POST':

        if request.POST.get("form_type") == "form1":
            form_category_1 = Category_pk_for_form_category_Form(request.POST) 
            if form_category_1.is_valid():
                model_instance = form_category_1.save(commit=False)
                name_object = pk
                category_name = model_instance.category_name
                new_entry = Category_pk_for_form_category(name_object=name_object, category_name=category_name)
                new_entry.save()
                return redirect("book-detail", pk)            
        elif request.POST.get("form_type") == "form2":
            form_2 = Form_GPR(request.POST) 
            if form_2.is_valid():
                model_instance = form_2.save(commit=False)
                name_object = pk
                name_working = model_instance.name_working
                type_izm = model_instance.type_izm
                value_work = model_instance.value_work
                lyudi_norma = model_instance.lyudi_norma
                technik_norma = model_instance.technik_norma
                date_begin = model_instance.date_begin
                date_end = model_instance.date_end
                new_entry = CreateNewGPR(name_object=name_object, name_working=name_working, type_izm=type_izm, value_work=value_work, lyudi_norma=lyudi_norma, technik_norma=technik_norma, date_begin=date_begin, date_end=date_end)
                new_entry.save()
                return redirect("book-detail", pk)

    context['form_category_1'] = form_category_1
    context['form_2'] = form_2

    """ Gets an individual book object from the database, based on its ID/PK. Renders a detail template """
    book = get_object_or_404(ArkiObject_1, pk=pk)

    filter_qs = CreateNewGPR.objects.filter(name_object=pk)
    filter_qs = filter_qs.values("name_working", "type_izm", "value_work", "lyudi_norma", "technik_norma", "date_begin", "date_end")

    context['books'] = filter_qs
    return render(request, 'bookdetail.html', context)

На мой взгляд, вы можете динамически задавать параметры для поля формы Django, переопределяя метод __init__ формы и передавая параметры из вашего представления. Нет необходимости использовать временную модель только для хранения вариантов; вы можете создать список вариантов непосредственно из вашего набора запросов.

Пример:

Предположим, у вас есть следующие модели:

class Category(models.Model):
    name_object = models.IntegerField()
    category_name = models.CharField()

И ваша форма:

from django import forms
from .models import CreateNewGPR

class FormGPR(forms.ModelForm):
    class Meta:
        model = CreateNewGPR
        fields = ("name_category", "name_working", "type_izm", "value_work", "lyudi_norma", "technik_norma", "date_begin", "date_end")
        widgets = {
            "name_category": forms.RadioSelect(),
            "date_begin": forms.DateInput(attrs={"type": "date"}),
            "date_end": forms.DateInput(attrs={"type": "date"}),
        }

    def __init__(self, *args, **kwargs):
        category_choices = kwargs.pop('category_choices', [])
        super().__init__(*args, **kwargs)
        self.fields['name_category'].widget.choices = category_choices

На ваш взгляд, отфильтруйте и обработайте данные по мере необходимости, затем передайте варианты в форму:

def book(request, pk):
    # Filter categories for this object
    categories = Category.objects.filter(name_object=pk)
    category_choices = [(cat.category_name, cat.category_name) for cat in categories]

    form = FormGPR(category_choices=category_choices)

    if request.method == 'POST':
        form = FormGPR(request.POST, category_choices=category_choices)
        if form.is_valid():
            # Save your form
            form.save()
            return redirect('some-view')

    return render(request, 'your_template.html', {'form': form})
Вернуться на верх