ValueError при отображении формы в шаблоне

Ок, уже третий день ищу решение этой ошибки, так что спрошу здесь.

Я знаю, что есть и другие вопросы, похожие на мой, но, видимо, все остальные имеют другую причину. Это моя установка: Версия Джанго: 2.1.5 Версия Python: 3.7.1

Моя ошибка такова:

ValueError at /testsel

too many values to unpack (expected 2)

Это моя трассировка:

Traceback (most recent call last):
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/core/handlers/base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/core/handlers/base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/ricardo/Projects/Organizacional/organizacional/home/views.py", line 36, in testsel
    return render(request,'home/testsel.html',{ 'form':form })
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/shortcuts.py", line 36, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/template/loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/template/base.py", line 171, in render
    return self._render(context)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/template/base.py", line 163, in _render
    return self.nodelist.render(context)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/template/base.py", line 937, in render
    bit = node.render_annotated(context)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/template/base.py", line 904, in render_annotated
    return self.render(context)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/template/base.py", line 163, in _render
    return self.nodelist.render(context)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/template/base.py", line 937, in render
    bit = node.render_annotated(context)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/template/base.py", line 904, in render_annotated
    return self.render(context)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/template/loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/template/base.py", line 937, in render
    bit = node.render_annotated(context)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/template/base.py", line 904, in render_annotated
    return self.render(context)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/template/base.py", line 993, in render
    return render_value_in_context(output, context)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/template/base.py", line 972, in render_value_in_context
    value = str(value)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/utils/html.py", line 397, in <lambda>
    klass.__str__ = lambda self: mark_safe(klass_str(self))
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/forms/forms.py", line 142, in __str__
    return self.as_table()
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/forms/forms.py", line 284, in as_table
    errors_on_separate_row=False,
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/forms/forms.py", line 202, in _html_output
    top_errors = self.non_field_errors()  # Errors that should be displayed above all fields.
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/forms/forms.py", line 313, in non_field_errors
    return self.errors.get(NON_FIELD_ERRORS, self.error_class(error_class='nonfield'))
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/forms/forms.py", line 180, in errors
    self.full_clean()
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/forms/forms.py", line 381, in full_clean
    self._clean_fields()
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/forms/forms.py", line 393, in _clean_fields
    value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/forms/widgets.py", line 648, in value_from_datadict
    return getter(name)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/db/models/query.py", line 390, in get
    clone = self.filter(*args, **kwargs)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/db/models/query.py", line 844, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/db/models/query.py", line 862, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1263, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1287, in _add_q
    split_subq=split_subq,
  File "/home/ricardo/anaconda3/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1161, in build_filter
    arg, value = filter_expr
ValueError: too many values to unpack (expected 2)

Это функция, которая вызывается в views.py:

def testsel(request):
    if request.method= = "POST":
        pass #just testing for now
    else:
        form=SelectTest(Tests.objects.all())
    return render(request,'home/testsel.html',{ 'form':form })

Это форма, которая определена в forms.py:

class SelectTest(forms.Form):
    def __init__(self, *args, **kwargs):
        super(SelectTest,self).__init__(*args,**kwargs)
        CHOICES=args[0].values('sigla')
        CHOICES=[(s['sigla'],s['sigla'].lower()) for s in CHOICES]
        self.fields['select']=forms.ChoiceField(widget=forms.Select(),choices=CHOICES)

Это мой шаблон:

{% block content %}
<form action = "" method = "post">{% csrf_token %}
    {{ form }} 
  <button type = "submit">Enviar</button>
</form>
{% endblock content %}

Это тесты, которые вызываются в views.py (хотя я не думаю, что это действительно имеет значение):

class Tests(models.Model):
    name = models.CharField(max_length=100)
    sigla = models.CharField(max_length=10)
    instruction = models.TextField()
    about = models.TextField()
    nquestions = models.PositiveIntegerField()
    table = models.CharField(max_length=10)

Теперь, если я изменю свой шаблон на это:

{% for field in form %}
    {{ field.select }}
{% endfor %}

он отображается без ошибок, но форма не отображается или отображается в «источнике просмотра». Если я использую только field внутри цикла, я возвращаюсь к «слишком большому количеству значений для распаковки».

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

Цените любую помощь.

Почему в 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
0
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первый аргумент формы — это данные для ее привязки. Вы передаете туда набор запросов и сразу же передаете его суперклассу, который вызывает ошибку.

Если вы хотите передать дополнительные данные в форму, вы всегда должны использовать аргумент ключевого слова и удалять его из словаря kwargs перед вызовом super.

form=SelectTest(sigla=Tests.objects.all())

...

class SelectTest(forms.Form):
    def __init__(self, *args, **kwargs):
        sigla = kwargs.pop('sigla', None)
        super(SelectTest,self).__init__(*args,**kwargs)

Обратите внимание: вам, вероятно, следует использовать ModelChoiceField, который принимает набор запросов напрямую, а не простой ChoiceField.

Красивый! Большое тебе спасибо!

Ricardo Fernandes Campos 10.02.2019 20:54

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