【问题标题】:Cannot access value for CheckboxSelectMultiple using request.POST无法使用 request.POST 访问 CheckboxSelectMultiple 的值
【发布时间】:2020-01-09 06:11:15
【问题描述】:

我正在设计一个表单,它使用 CheckboxSelectMultiple 让用户选择披萨的配料。 Topping 是它自己的类,只有一个“名称”属性。

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)

我已尝试通过文档进行一些搜索,但似乎无法找出我的问题。谢谢!

【问题讨论】:

  • 你有一个 str 函数在顶部返回 self.name

标签: django forms checkbox


【解决方案1】:

首先:如果您想在 CheckboxSelectMultiple 中获取所有选定项目的编号/ID,您需要使用 getlist 方法:

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

这将返回您选择的浇头的数量列表。

话虽如此,看看你的代码,这可能仍然不会产生你想要的结果。如果您使用建议的代码更改上一个代码 sn-p,您将获得 AttributeError:

'str' object has no attribute 'label'

因为你的号码(如str)没有这个属性。

那么为什么不使用表格呢?在您看来:

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

form.cleaned_data 是您发布的结果的dictform.cleaned_data['toppings']querset 与您选择的浇头。有了这些,你可以做任何你想做的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-23
    • 2019-02-22
    • 2020-01-09
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多