Django. Создание форм и написание полей

Я создаю форму, что бы в ней была возможность для пользователя, добавить свой вариант ответа, если он не нашёл его в выпадающем списке.

Моя проблема в том, что у меня не получается связать выпадающий список(который является Foreign Key данной модели) и пустую строку для ввода, вместе.

В forms.py, можно вручную прописать варианты для ввода, но хотелось бы, что бы они были динамичными.

Понимаю, что кода много, но может хоть кто то наведёт на мысль

forms.py

class AddFriend(forms.Form):
    who = forms.CharField(max_length=20, label="Кто наш новый друг",
                          widget=forms.TextInput(attrs={"class": "form-control"}))
    how_old = forms.IntegerField(label="Сколько лет", widget=forms.TextInput(attrs={"class": "form-control"}))
    discribe = forms.CharField(label="Описание")
    work = forms.CharField(label="Кем работает")
    hobby = forms.CharField(label="Хобби")
    photo = forms.ImageField(label="Фото", required=False)
    place = ChoiceWithOtherField(choices=[
        (1, WhoIsFrom.objects.all()),
        (2, "Ввести свой вариант:")],
        label="Откуда")

fields.py

class ChoiceWithOtherField(forms.MultiValueField):
    def __init__(self, *args, **kwargs):
        fields = [
            forms.ModelChoiceField(queryset=WhoIsFrom.objects.all()),
            forms.CharField(required=False)
        ]
        widget = ChoiceWithOtherWidget(choices=kwargs['choices'])
        kwargs.pop('choices')
        self._was_required = kwargs.pop('required', True)
        kwargs['required'] = False
        super(ChoiceWithOtherField, self).__init__(widget=widget, fields=fields, *args, **kwargs)

    def compress(self, value):
        if self._was_required and not value or value[0] in (None, ''):
            raise forms.ValidationError(self.error_messages['required'])
        if not value:
            return [None, 'u']
        return value[1] if force_text(value[0]) == force_text(self.fields[0].choices[-1][0]) else 'u'

widgets.py

class ChoiceWithOtherWidget(forms.MultiWidget):
    """MultiWidget for use with ChoiceWithOtherField."""

    def __init__(self, choices):
        widgets = [
            forms.RadioSelect(choices=choices),
            forms.TextInput
        ]
        super(ChoiceWithOtherWidget, self).__init__(widgets)

    def decompress(self, value):
        if not value:
            return [None, None]
        return value

    def format_output(self, rendered_widgets):
        "Format the output by substituting the "other" choice into the first widget."
        return rendered_widgets[0] % rendered_widgets[1]

models.py

class MyHouse2(models.Model):
    who = models.CharField(max_length=20, verbose_name="Кто")
    how_old = models.IntegerField(null=True, verbose_name="Сколько лет")
    discribe = models.TextField(blank=True, verbose_name="Описание")
    work = models.CharField(max_length=20, blank=True, verbose_name="Работа")
    hobby = models.CharField(max_length=20, blank=True, verbose_name="Хобби")
    photo = models.ImageField(upload_to="photos/", max_length=150, blank=True, verbose_name="Твоё фото")
    place = models.ForeignKey("WhoIsFrom", on_delete=models.PROTECT, null=True, verbose_name="Откуда")
Вернуться на верх