Как решить такую проблему 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 шт):

Автор решения: Elin Malikzade

Я так понимаю, у тебя набор С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). И каждая переменная в таком случае сохранила бы в себе весь элемент из набора.

Но это скорее всего не то, что ты хотел сделать. А скорее всего ты хотел разбить определенный элемент на две переменные, и поэтому нужно сначала выбрать этот элемент.

Надеюсь смог помочь.

→ Ссылка