Не удается распаковать не итерируемый объект Django

#python #django

#питон #джанго

Вопрос:

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

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

Классы, которые я использовал в качестве модели для формы:

 class Contato(models.Model):
    nome = models.CharField(max_length=255)
    sobrenome = models.CharField(max_length=255, blank=True)
    telefone = models.CharField(max_length=255)
    email = models.CharField(max_length=255, blank=True)
    data_criacao = models.DateTimeField(
        default=timezone.now)
    descricao = models.TextField(blank=True)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)
    categoria = models.ForeignKey(
        Categoria, on_delete=models.DO_NOTHING)
    mostrar = models.BooleanField(default=True)
    foto = models.ImageField(blank=True, upload_to='fotos/%y/%m/%d')

    def __str__(self):
        return self.nome


class Categoria(models.Model):
    nome = models.CharField(max_length=255)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.nome
 

это код из формы, которую я пытаюсь изменить

 class ContatoForm(forms.ModelForm):
    class Meta:
        model = Contato
        exclude = ('created_by',)

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user', None)
        super(ContatoForm, self).__init__(*args, **kwargs)

        category_choices = list(Categoria.objects.filter(
            created_by=self.user))

        self.fields['categoria'] = forms.ChoiceField(choices=category_choices)
 

И это представление, в котором я использую эту форму

 @login_required(redirect_field_name='login')
def dashboard(request):
    if request.method != 'POST':
        form_contato = ContatoForm(user=request.user)
        form_categoria = CategoriaForm

        return render(request, 'accounts/dashboard.html', {'form_contato': form_contato, 'form_categoria': form_categoria})

 

Ошибка:

 Traceback (most recent call last):
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangocorehandlersexception.py", line 47, in inner
    response = get_response(request)
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangocorehandlersbase.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangocontribauthdecorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "D:gabrielcodandostudyingdjango_learningDjangoProj_agendaaccountsviews.py", line 107, in dashboard
    return render(request, 'accounts/dashboard.html', {'form_contato': form_contato, 'form_categoria': form_categoria})
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangoshortcuts.py", line 19, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangotemplateloader.py", line 62, in render_to_string
    return template.render(context, request)
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangotemplatebackendsdjango.py", line 61, in render
    return self.template.render(context)
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangotemplatebase.py", line 170, in render
    return self._render(context)
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangotemplatebase.py", line 162, in _render
    return self.nodelist.render(context)
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangotemplatebase.py", line 938, in render
    bit = node.render_annotated(context)
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangotemplatebase.py", line 905, in render_annotated
    return self.render(context)
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangotemplateloader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangotemplatebase.py", line 162, in _render
    return self.nodelist.render(context)
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangotemplatebase.py", line 938, in render
    bit = node.render_annotated(context)
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangotemplatebase.py", line 905, in render_annotated
    return self.render(context)
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangotemplateloader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangotemplatebase.py", line 938, in render
    bit = node.render_annotated(context)
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangotemplatebase.py", line 905, in render_annotated
    return self.render(context)
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangotemplatebase.py", line 994, in render
    return render_value_in_context(output, context)
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangotemplatebase.py", line 973, in render_value_in_context
    value = str(value)
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangoutilshtml.py", line 376, in <lambda>
    klass.__str__ = lambda self: mark_safe(klass_str(self))
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangoformsforms.py", line 132, in __str__
    return self.as_table()
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangoformsforms.py", line 270, in as_table
    return self._html_output(
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangoformsforms.py", line 227, in _html_output
    output.append(normal_row % {
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangoutilshtml.py", line 376, in <lambda>
    klass.__str__ = lambda self: mark_safe(klass_str(self))
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangoformsboundfield.py", line 34, in __str__
    return self.as_widget()
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangoformsboundfield.py", line 90, in as_widget
    attrs = self.build_widget_attrs(attrs, widget)
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangoformsboundfield.py", line 225, in build_widget_attrs
    if widget.use_required_attribute(self.initial) and self.field.required and self.form.use_required_attribute:
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangoformswidgets.py", line 705, in use_required_attribute
    return use_required_attribute and first_choice is not None and self._choice_has_empty_value(first_choice)
  File "C:UsersCARVALHOAppDataLocalProgramsPythonPython310libsite-packagesdjangoformswidgets.py", line 691, in _choice_has_empty_value
    value, _ = choice

Exception Type: TypeError at /accounts/dashboard/
Exception Value: cannot unpack non-iterable Categoria object
 

Комментарии:

1. Инициализируйте объект формы, т. е. form_categoria = CategoriaForm() . Также в следующий раз опубликуйте все сообщение об ошибке с полной трассировкой .

2. Полная трассировка огромна , вот почему я не опубликовал ее, извините:/ Я добавлю это в сообщение и попытаюсь воспользоваться вашей помощью, спасибо!

3. Несмотря на то, что я создал его, я продолжаю получать ту же ошибку

4. Хорошо, обратная трассировка объясняет это: смотрите Документы для выбора . Вы присваиваете ему список Categoria объектов, но он должен быть «итерируемым из 2-х кортежей» . Мы не видим ваш Categoria класс, но попробуйте что-то вроде choices=[(c.id, c.name) for c in category_choices] .

5. Теперь это работает, большое вам спасибо. Я собираюсь взглянуть на документацию по выбору. На этой неделе я начал тестировать и изучать Django.