Как решить такую проблему ValueError at /category/prutok/armatura/ too many values to unpack (expected 2)
При работе с формами django столкнулся с проблемой при создании ChoiceField. Нужно передать в функцию slug и отфильтровать параметры, соответствующие этому товару. Никак не могу найти оптимальное решение. Код выглядит вот так:
forms.py:
class ProductParameterForm(forms.Form):
parameter = forms.ChoiceField()
def get_parameter(prod_slug):
qs = ProductParameter.objects.filter(product_info__product__slug=prod_slug)
choice = [i.__str__() for i in qs]
form = ProductParameterForm()
form.fields['parameter'].choices = choice
return form
views.py
class ProductDetailsView(DataMixin, DetailView):
model = ProductInfo
template_name = 'main/product.html'
context_object_name = 'product'
self_url_kwarg = ('prod_slug', 'cat_slug')
allow_empty = False
def get_object(self, queryset=None):
product = ProductInfo.objects.filter(product__slug=self.kwargs['prod_slug'])
# print(product)
return product
def get_context_data(self, *, object_list=None, **kwargs):
context = super().get_context_data(**kwargs)
context['parameter'] = get_parameter(prod_slug=self.kwargs['prod_slug'])
context['quantity'] = OrderItemCreateForm()
context['category'] = Category.objects.filter(slug=self.kwargs['cat_slug'])
c_def = self.get_user_context(cat_selected=context['category'][0].slug)
context = dict(list(context.items()) + list(c_def.items()))
return context
При обращении к parameter в шаблоне выдает такую ошибку:
ValueError at /category/prutok/armatura/
too many values to unpack (expected 2)
Request Method: GET
Request URL: http://127.0.0.1:8000/category/prutok/armatura/
Django Version: 4.2.5
Exception Type: ValueError
Exception Value:
too many values to unpack (expected 2)
/Users/ilyasvaleev/Documents/Programming/Django/metall_shop/venv/lib/python3.11/site-packages/django/forms/widgets.py, line 766, in _choice_has_empty_value
value, _ = choice
^^^^^^^^ …
Local vars
Variable Value
choice
'диаметр - 20'
Помогите, пожалуйста!
Ответы (1 шт):
Я так понимаю, у тебя набор Сhoices выглядят на подобии:
MY_CHOICES = (
("1", "One"),
("2", "Two"),
("3", "Three"),
("4", "Four"),
("5", "Five"),
)
и когда ты хочешь разбить скажем первый элемент выборки (т.е. ("1", "One")) на переменные, и сохранить значение "1" в переменной value, ты должен сначала выбрать этот элемент, и уже потом попытаться его разбить:
choice_index = 0 # любой индекс, 0 тут как пример
my_choice = MY_CHOICES[choice_index]
value, _ = my_choice
Ты же пытаешься разбить сам набор, а не конкретный элемент внутри набора. А в наборе вероятно больше двух элементов. Если я пытаюсь сделать:
value, _ = MY_CHOICES
то я получаю ту же самую ошибку. А вот если бы я сделал:
a, b, c, d, e = MY_CHOICES
то ошибки бы не было, так как число переменных совпадало бы с числом элементов в наборе (в моем случае 5). И каждая переменная в таком случае сохранила бы в себе весь элемент из набора.
Но это скорее всего не то, что ты хотел сделать. А скорее всего ты хотел разбить определенный элемент на две переменные, и поэтому нужно сначала выбрать этот элемент.
Надеюсь смог помочь.