Ошибка проверки Django ModelMultipleChoice

Я пытаюсь отправить динамическое количество выбранных флажков на obj.html функции / items. Я получаю ошибку

"Select a valid choice. 1234 is not one of the available choices."

Но вы заметите, что я печатаю набор запросов из # views.py, он выводит, что 1234 содержится в плоском наборе запросов, с кавычками.

print(form.fields['choices'].queryset)
# Console output
['1234', '1243',...]

Почему 1234 не является одним из доступных вариантов? Я пробовал заключить в кавычки атрибут значения в форме ввода, но это не сработало. Функция items останавливается, потому что данные недействительны. Как я могу это решить?

# forms.py
class ItemForm(forms.Form):
  choices = forms.ModelMultipleChoiceField(widget = forms.CheckboxSelectMultiple,
  queryset = Sampledata.objects.none())

# views.py
def obj(request, object_id,):
    data = Sampledata.objects.filter(id=object_id)
    form = ItemForm()
    form.fields['choices'].queryset = list(data.values_list('value', flat=True))
    print(form.fields['choices'].queryset)
    return render(request, 'obj.html', {'data':data,'form':form})

def items(request):
    if request.method == 'POST':
        form = ItemForm(request.POST)
        # check whether it's valid:
        if form.is_valid():
           ...

# obj.html
   <form action = "/items" method = "post">
   # Many of these spread out throughout the page
   {% for obj in data %}
   <input type = "checkbox" name = "choices" value = "{{obj.value}}">
   {% endfor %}
   <input type = "submit" value = "Submit">

Обновлено, но по-прежнему возникает та же ошибка:

def items(request, object_id):
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = ItemForm(request.POST)
        data = Sampledata.objects.filter(id=object_id)
        form.fields['choices'].queryset = (data.values_list('value', flat=True))
        # check whether it's valid:
        if form.is_valid():

Но вы модифицируете его в obj, а обрабатываете в items. Это два отдельных представления и два отдельных экземпляра ItemForm.

Daniel Roseman 26.09.2018 17:18

@DanielRoseman Так вы говорите, что мне нужно добавить form.fields['choices'].queryset = list(data.values_list('value', flat=True)) в def items?

Andrew Fleischer 26.09.2018 17:22

Или, еще лучше, сделайте их одним видом. Почему они разделены? Кроме того, этот код должен действительно существовать в самой форме, в методе __init__; но вам все равно нужно будет передать object_id, так что еще лучше сделать его одним единственным представлением. (И отдельно, почему вы все это делаете с values_list? Атрибут queryset просто должен быть набором запросов.)

Daniel Roseman 26.09.2018 17:30

@DanielRoseman Я сделал их отдельными, потому что obj.html зависит от предыдущей формы, которая также является динамической. Я понимаю вашу точку зрения, и я пересмотрю свое решение. Значение, которое выбирает пользователь, является одним из многих атрибутов в Object, поэтому я решил использовать values_list, чтобы получить набор запросов этих значений. Разве это не так? Я переместил значение набора запросов в элементы и получаю ту же ошибку

Andrew Fleischer 26.09.2018 17:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
106
0

Другие вопросы по теме