14

私は次のモデルを持っています:

class Category(models.Model):
    name = models.CharField(max_length=40)

class Item(models.Model):
    name = models.CharField(max_length=40)
    category = models.ForeignKey(Category)

class Demo(models.Model):
    name = models.CharField(max_length=40)
    category = models.ForeignKey(Category)
    item = models.ForeignKey(Item)

新しいデモを作成するときの管理インターフェースで、ユーザーがドロップダウンからカテゴリを選択した後、[アイテム]ドロップダウンの選択肢の数を制限したいと思います。ユーザーが別のカテゴリを選択した場合、アイテムの選択肢はそれに応じて更新されます。サーバーでフォームの検証が行われる前に、クライアントでのアイテムの選択を制限したいと思います。これは使いやすさのためです。アイテムのリストは1000以上になる可能性があるため、カテゴリ別に絞り込むことができれば、管理しやすくなります。

それを行うための「django-way」はありますか、それともカスタムJavaScriptがここでの唯一のオプションですか?

4

3 に答える 3

10

カテゴリが変更されたときに項目オプションの値を変更するための JavaScript (JQuery ベース) を次に示します。

<script charset="utf-8" type="text/javascript">
  $(function(){
    $("select#id_category").change(function(){
      $.getJSON("/items/",{id: $(this).val(), view: 'json'}, function(j) {
        var options = '<option value="">--------&nbsp;</option>';
        for (var i = 0; i < j.length; i++) {
          options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
        }
        $("#id_item").html(options);
        $("#id_item option:first").attr('selected', 'selected');
      })
      $("#id_category").attr('selected', 'selected');
    })
  })
</script>

有効なアイテムの JSON リストを提供する /items/ URL で呼び出されるビューが必要です。

モデル管理メディア定義を使用して、これを管理にフックできます。

于 2009-04-28T07:07:33.667 に答える
7

django-smart-selects があります:

次のモデルがある場合:

class Location(models.Model)
    continent = models.ForeignKey(Continent)
    country = models.ForeignKey(Country)
    area = models.ForeignKey(Area)
    city = models.CharField(max_length=50)
    street = models.CharField(max_length=100)

大陸を選択すると、この大陸にある国のみが利用可能になり、地域についても同様に、次のことが可能になります。

from smart_selects.db_fields import ChainedForeignKey 

class Location(models.Model)
    continent = models.ForeignKey(Continent)
    country = ChainedForeignKey(
        Country, 
        chained_field="continent",
        chained_model_field="continent", 
        show_all=False, 
        auto_choose=True
    )
    area = ChainedForeignKey(Area, chained_field="country", chained_model_field="country")
    city = models.CharField(max_length=50)
    street = models.CharField(max_length=100)
于 2013-08-07T01:06:07.787 に答える
0

オブジェクトをフィルタリングするための何らかの非サーバーベースのメカニズムが必要になります。それか、選択が行われたときにページをリロードすることができます (とにかく JavaScript で行われる可能性があります)。

そうしないと、サーバーからクライアントにデータのサブセットを取得する方法がありません。

于 2009-04-28T09:30:30.313 に答える