1

我不知道如何解决这个问题 - 我已经尝试了很多东西,但结果是在提交表单后我收到“太多值无法解包”错误。

这是正在运行的模型的简单演示:

class Supplier(models.Model):
    name = models.CharField(max_length=100)

class SupplierLocation(models.Model):
    supplier = models.ForeignKey(Supplier)
    location = models.CharField(max_length=100)

class Product(models.Model):
    supplier = models.ForeignKey(Supplier)
    name = models.CharField(max_length=100)
    price = models.DecimalField(decimal_places=2,max_digits=10)

我想要做的是生成一个有 2 多个单选按钮的表单。SupplierLocation.location 是标签,SupplierLocation.id 是单选按钮的值。同样,Product.name 将是标签,Product.id 将是单选按钮的值。这个想法是我想将它们分组到按 Supplier.id 排序的块中,以便 html 看起来像这样:

<div>
    <table>
        <tr class="{{ Supplier.name }} hidden">
            <td>{{ location.name }}</td>
            <td><input type="radio" name="location_id" value="{{ location.id }}" /></td>
        </tr>
    </table>
    <table>
        <tr class="{{ Supplier.name }} hidden">
            <td>{{ product.name }}</td>
            <td>{{ product.price }}</td>
            <td><input type="radio" name="product_id" value="{{ product.id }}" /></td>
        </tr>
    </table>
</div>

显然,两个表中都会有多行,我很确定我应该能够使用小部件来代替硬编码的输入字段,但是我很困惑如何实现自定义表单。这个想法是,当页面加载时所有字段都被隐藏,当从页面上的链接中选择供应商时,这些字段在 JS 中可见。

我不确定表格应该是什么样子,以及我应该使用模型表格还是标准表格。在我当前的测试中,我有一个如下所示的表单:

表格.py

class ProductLocationForm(forms.Form):
    PRODUCT_CHOICES = [(p.id, p.name) for p in Product.objects.all()]
    LOCATION_CHOICES = [(l.id, l.name) for l in SupplierLocation.objects.all()]
    product = forms.ChoiceField(widget=forms.RadioSelect, choices=PRODUCT_CHOICES)
    location = forms.ChoiceField(widget=forms.RadioSelect, choices=LOCATION_CHOICES)

这给了我产品和位置,但缺少供应商分组或任何隔离供应商的方式,因此我可以使用 JS 隐藏/显示它们。

任何帮助都是极好的。

4

1 回答 1

1

您可以使用而不是手动ModelChoiceField构建。choices然后,您将拥有queryset该字段的属性,并且能够在模板中进行类似的操作:

{% regroup form.fields.product.queryset by supplier as grouped_products %}
{% for gp in grouped_products %}
    Supplier: {{ gp.grouper }} 
    {% for choice in gp.list %}
        <input type="radio" name="product" value="{{ choice.pk }}" /> {{ choice }}
    {% endfor %}
{% endfor %}
于 2012-04-19T04:57:23.797 回答