#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.