2016-10-13 5 views
2

Я работаю над созданием базы данных, в которой есть программы, и эти программы имеют риски. Некоторая справочная информация: Программы (бабушки и дедушки) имеют несколько характеристик (родителей), которые имеют несколько категорий (детей). Я уже создал базу данных, содержащую их, однако я хочу добавить риски к конкретной программе.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) 
+0

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

ответ

0

Чтобы перефразировать ваш вопрос, вы спрашиваете, как предварительно заполнить поля формы? Если да, рассмотрим использование initial values in your formsets

+0

Нет, извините за недоразумение из-за того, что на втором экране печати начальные значения задаются как ---- --- На первом экране печати я уже установил их вручную. Вопрос скорее в том, как динамически определять «char» (таким образом, переменная получает метку char) в последней строке кода. однако, я не знаю, как это сделать. –

Смежные вопросы