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="Откуда")