Динамическое создание поля множественного выбора
Моя цель - создать django форму для выбора устройств, отфильтрованных по полям страны и клуба. Моя форма выглядит следующим образом:
class MyForm(Form):
country = ChoiceField(choices=some_choices, initial=None)
club = CharField(widget=Select())
expiration_date = DateField()
sales_info = ChoiceField(choices=SALES_TYPES, initial=None)
devices = MultipleChoiceField(widget=CheckboxSelectMultiple(choices=[]))
def clean_devices(self):
devices = self.cleaned_data.get("devices")
if not devices:
raise ValidationError("At least one device must be selected.")
return devices
def save(self):
...
views.py
class MyFormView(LoginRequiredMixin, FormView):
template_name = "store/my_template.html"
form_class = MyFormView
def get_success_url(self):
return reverse('init_device')
def form_valid(self, form):
init_device = form.save()
if init_device:
return super().form_valid(form)
return super().form_invalid(form)
def form_invalid(self, form):
logger.error(form.errors)
my_template.html
<form action="{% url 'init_device' %}" method="post">
{% csrf_token %}
...
<select id="id_devices" name="devices" multiple>
Я заполняю поле select через javascript таким образом:
let device_select = document.getElementById("id_devices");
serialIds.forEach(serialId => {
let option = document.createElement("option");
option.text = serialId;
option.value = serialId;
device_select.add(option);
});
Я получил отфильтрованные устройства формы db с помощью websocket, но теперь я не могу передать их в форму, потому что возникает эта ошибка:
ValueError: The view path.view didn't return an HttpResponse object. It returned None instead.
Затем я печатаю form.errors
и это отображается <ul class="errorlist"><li>devices<ul class="errorlist"><li>Select a valid choice. device_attriubte is not one of the available choices.</li></ul></li></ul>
Может ли кто-нибудь помочь мне? Заранее спасибо!
Слишком много сразу?
Сначала получите от пользователя выбор страны и клуба и подтвердите их, насколько это возможно. Когда это будет сделано, перенаправьте на URL-адрес, например
app/choose_device/country/club
и в представлении, которое вызывается, используйте kwargs country
и club
в queryset своей формы ModelMultipleChoiceField. Это нормализуется до списка экземпляров моделей (объектов устройств), когда форма проходит валидацию.
(Я предполагаю, что устройства являются объектами в вашей БД. Это подразумевается вашим использованием "filtered", но не является явным).