Django Динамическое добавление вариантов в форму поля выбора
Я хочу динамически добавлять варианты в форму из данных, полученных в views.py. Этот список будет часто меняться, поэтому я не могу сделать это жестким кодом.
Я выполняю запрос к API AWS и извлекаю резервные копии. Я пытаюсь получить эти резервные копии в виде списка, затем получить их в виде выпадающего списка для отправки в форме.
forms.py
class RestoreAMIForm(forms.ModelForm):
ami = forms.ChoiceField()
def __init__(self, *args, **kwargs):
super(RestoreAMIForm, self).__init__(*args, **kwargs)
self.fields['server_name'].widget.attrs['readonly'] = True
self.fields['module_name'].widget.attrs['readonly'] = True
self.fields['instance_id'].widget.attrs['readonly'] = True
class Meta:
model = RestoreRequest
fields = ['server_name', 'module_name', 'instance_id', 'ami', 'justification']
views.py
amis = helper_functions.get_all_backups(instance_id, GlobalrunEnv)
context['ami'] = amis
just_amis = [i[0] for i in context['ami']]
formatted_picker = helper_functions.iterate_over_list(just_amis)
context['restore_ami_form'] = RestoreAMIForm(initial={'server_name': context['tags']['Name'],
'instance_id': context['server_details']['InstanceId'],
'module_name': context['passed_slug'],
'ami': formatted_picker, })
html
<form action="{% url 'instance_details' passed_slug %}" method="post">
<p class="standout"> Revert to Snapshot:</p>
<table>
{{ restore_ami_form.as_table }}
</table>
<div class="buttonHolder">
<button name="RevertRequest" value="{{ GlobalrunEnv }}">Submit New Values</button>
</div>
</form>
выход format_picker это...
[('1', 'ami-04e05d8b305348d89'), ('2', 'ami-0f82b7ac27bdeb246'), ('3', 'ami-0eed0d484f0d61391'), ('4', 'ami-071cfbc9eda4cae4d'), ('5', 'ami-0dc61e733721e7e7a'), ('6', 'ami-05ba2995c14da2502'), ('7', 'ami-01cb5e766d77f8ecb')]
мои поля только для чтения работают. Возможно ли предоставить начальные значения для полей выбора?
Всем любопытным я нашел способ решить эту задачу. Я изменил init формы, чтобы она принимала "внутренние варианты". Затем при создании формы в views.py я передаю вот это перед начальными kwargs.
Позже это вызвало небольшую проблему, поскольку я не могу напрямую ссылаться на значения опций, но я обошел это, используя...
request.session['archived_amis'] = formatted_picker
then in the post doing ami_choices = request.session.get('archived_amis', None)
изменения ниже
views.py
formatted_picker = helper_functions.iterate_over_list(just_amis)
"""This data needs to be saved to reference later in the post, in the off chance that the data changes between
initially loading the variable and submitting the form"""
request.session['archived_amis'] = formatted_picker
context['restore_ami_form'] = RestoreAMIForm(formatted_picker, initial={'server_name': context['tags']['Name'],
'instance_id': context['server_details']['InstanceId'],
'module_name': context['passed_slug'], })
forms.py
class RestoreAMIForm(forms.ModelForm):
# ami = forms.ChoiceField()
def __init__(self, internal_choices, *args, **kwargs):
super(RestoreAMIForm, self).__init__(*args, **kwargs)
self.fields['server_name'].widget.attrs['readonly'] = True
self.fields['module_name'].widget.attrs['readonly'] = True
self.fields['instance_id'].widget.attrs['readonly'] = True
self.fields['ami'] = forms.ChoiceField(label='AMI', required=True, choices=internal_choices)
class Meta:
model = RestoreRequest
fields = ['server_name', 'module_name', 'instance_id', 'ami', 'justification']