Невозможно получить доступ к значению CheckboxSelectMultiple, используя request.POST - PullRequest
0 голосов
/ 09 января 2020

Я разрабатываю форму, которая использует CheckboxSelectMultiple, чтобы позволить пользователю выбирать начинки для пиццы. Topping - это собственный класс с атрибутом name.

class Pizza(models.Model):
    menu = models.ForeignKey(Menu, on_delete=models.CASCADE, related_name="pizza")
    style = models.ForeignKey(PizzaStyle, on_delete=models.CASCADE)
    size = models.ForeignKey(Size, on_delete=models.CASCADE)
    is_special = models.BooleanField(default=False)
    num_toppings = models.IntegerField()
    toppings = models.ManyToManyField(Topping, blank=True)
    price = models.DecimalField(max_digits=5, default=0.00, decimal_places=2)

class PizzaForm(ModelForm):
    class Meta:
        model = Pizza
        exclude = ['menu', 'price']
        widgets = {
            'toppings': CheckboxSelectMultiple,
        }
        labels = {
            'num_toppings': 'Number of Toppings',
            'is_special': 'Gluten Free Dough'
        }

Форма создает в views.py штраф с правильными метками для каждого Topping. Однако, когда я передаю данные формы на другую страницу (корзину), я могу передать только номер последнего флажка, выбранного в форме. (т.е. если пепперони выбран и является третьим флажком в списке, то request.POST ['toppings'] возвращает 3.

Я пытаюсь сделать что-то подобное в views.py для корзины так, чтобы Я могу сгенерировать список начинки:

toppings = ""
for topping in request.POST['toppings']:
     print(topping.label)
     toppings = ", ".join(topping)

Я пробовал поискать документацию, но не могу понять мою проблему. Спасибо!

1 Ответ

0 голосов
/ 09 января 2020

Прежде всего: если вы хотите получить номера / идентификаторы всех выбранных вами элементов в CheckboxSelectMultiple, вам нужно использовать метод getlist:

for topping in request.POST.getlist('toppings'):

Это вернет список номеров ваших выбранные начинки.

Сказав это, и глядя на ваш код, это все еще, вероятно, не даст желаемых результатов. Если вы измените свой последний фрагмент кода с предложенным кодом, вы получите AttributeError:

'str' object has no attribute 'label '

, поскольку ваш номер (в виде строки) не имеет этого атрибута.

Так почему бы не использовать форму? По вашему мнению:

form = PizzaForm(request.POST or None)
if form.is_valid():
    for topping in form.cleaned_data['toppings']:
        print(topping.label)

form.cleaned_data является dict из ваших опубликованных результатов. form.cleaned_data['toppings'] - это querset с выбранными вами начинками. С ними вы можете делать все, что захотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...