2012-04-19 5 views
1

この問題に取り組む方法がわかりません - 私はたくさんのことを試しましたが、フォームを送信した後に解凍するための多くの値 "エラーが発生します。Djangoフォーム - いくつかの異なるモデルのフィールドを表示しているが、外部キーでソートしたフォームを作成する

これはプレイしているモデルの簡単なデモである:私は何をしようとしている

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でそれらを表示/非表示できます。

ご協力いただければ幸いです。

答えて

1

choicesを手動で構築する代わりにModelChoiceFieldを使用できます。その後、フィールドの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 %} 
+0

おかげ@ilvar - 御馳走を働きました。私はこのフォームを構築するのに膨大な時間を無駄にしていました。私はその解決策が簡単ではないと思っていました。 – xplosiv

+0

もう1つ質問があります - このソリューションでは、入力タグをradioselectウィジェットに置き換える方法はありますか? – xplosiv

+0

選択ウィジェットはすべてのLIを1つのリストにレンダリングするので、グループ化の問題が増えます。 – ilvar

関連する問題