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はラジオボタンの値になります。アイデアは、htmlが次のようになるようにSupplier.idでソートされたブロックにそれらをグループ化することです。

<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で表示されるようになります。

フォームがどのように見えるか、モデルフォームと標準フォームのどちらを使用すべきかわかりません。私の現在のテストでは、次のようなフォームがあります。

forms.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 に答える