Django — динамические поля формы на основе внешнего ключа

#python #django #forms #dynamic #formset

#python #django #формы #динамический #набор форм

Вопрос:

Я работаю над созданием базы данных, в которой есть программы, и у этих программ есть риски. Некоторая справочная информация: Программы (дедушки и бабушки) имеют несколько характеристик (родителей), которые имеют несколько категорий (дочерние элементы). Я уже создал базу данных, содержащую их, однако я хочу добавить риски для конкретной программы.

То есть, например, у меня есть риск 1, который я хочу добавить в программу 1. Я должен ответить на следующие вопросы: какими характеристиками обладает риск 1? Чтобы ответить на это, я хочу создать поле динамической формы. (Обратите внимание, количество характеристик может быть любым произвольным числом, а также количеством категорий, которые имеет каждая характеристика).

Как мне создать такую форму? Я пробовал наборы форм, однако я не знаю, как реализовать их на практике (я все еще немного новичок в Python).

Это распечатка того, как я хочу, чтобы это было реализовано: https://gyazo.com/40c448c0096a9ec5da751ba9883dc912
Однако я понятия не имею, что делать. (Обратите внимание, что возможные ответы в выпадающем меню — это категории, соответствующие этой конкретной характеристике). Вот что я получаю: https://gyazo.com/25fd18e2f31e6931bfd3639ce4be632c

Это соответствующий код, который у меня есть до сих пор:

 # views.py 
def risk_create(request):
program = get_object_or_404(Program, id=20)
RiskFormSet = formset_factory(RiskForm, ...
    ... extra=len(Program.objects.get(id=program.id).char_set.all()))
context = {
    'title': 'New Risk',
    'form': RiskFormSet
}
return render(request, 'risk_form.html', context)


# forms.py
class RiskForm(forms.Form):
for char in Program.objects.get(id=20).char_set.all():
    char = forms.ModelChoiceField(char.cat_set.all(), label=char)
  

Я НАШЕЛ СВОЙ ОТВЕТ.

 class RiskForm(forms.Form):
def __init__(self, *args, **kwargs):
    programid = kwargs.pop('programid', None)
    super(RiskForm, self).__init__(*args, **kwargs)
    for i in range(0,len(Program.objects.get(id=programid).char_set.all())):
        charid = Program.objects.get(id=programid).char_set.all()[i].id
        charlabel = Program.objects.get(id=programid).char_set.all()[i].label
        self.fields['char_field_%i' %i] = forms.ModelChoiceField(Char.objects.get(id=charid).cat_set.all(), label=charlabel)
  

Комментарии:

1. Редактировать: допустим, у меня есть набор запросов символов (Char.objects.filter(program__id=char.program_id). Я хочу создать форму на основе этого набора запросов. То есть, скажем, этот набор запросов имеет 4 характеристики. В моей форме должно быть 4 поля, в которых запрашивается категория каждой характеристики

Ответ №1:

Перефразируя ваш вопрос, вы спрашиваете, как предварительно заполнить поля формы? Если это так, рассмотрите возможность использования начальных значений в ваших наборах форм

Комментарии:

1. Нет, прошу прощения за недоразумение из-за того, что на втором экране печати начальные значения задаются как ——-. На первом экране печати я уже установил для них значение вручную. Вопрос скорее в том, как динамически определять ‘char’ (таким образом, переменная получает метку char) в последней строке кода. Однако это невозможно, я хочу знать обходной путь