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']
Вернуться на верх