2011-02-07 14 views
3

私は次のモデルがあります: Django管理者階層のドロップダウンフィルタを表示

from django.db import models 

class State(models.Model): 
    name = models.CharField(max_length=30) 
    abbreviation = models.CharField(max_length=2) 

    def numberOfCities(self): 
     return self.city_set.count() 

    def __unicode__(self): 
     return u"{0} - {1}".format(self.abbreviation, self.name) 

class City(models.Model): 
    name = models.CharField(max_length=40) 
    state = models.ForeignKey(State) 

    class Meta: 
     verbose_name_plural = 'Cities' 

    def __unicode__(self): 
     return self.name 

class Company(models.Model): 
    name = models.CharField(max_length=60) 
    description = models.CharField(max_length=1000) 
    city = models.ForeignKey(City) 

    class Meta: 
     verbose_name_plural = 'Companies' 

    def __unicode__(self): 
     return self.name; 

あなたは、各企業が都市に関連付けられている、あなたが期待するようDjangoの管理者は、都市のドロップダウンを含む会社の作成フォームを生成見ることができるように

。しかし、ユーザーエクスペリエンスを向上させるためには、ユーザーが最初に状態を選択してから、都市のドロップダウンにその状態の都市が設定されるようにしたいと考えています。これを行う標準的な方法はありますか?

答えて

1

都市モデルを選択するためのカスタムウィジェットを作成する必要があります(つまり、モデルはFKから市区町村に、州ではありません)。このウィジェットには2つの選択フィールドがあり、最初のものにはSstatesが含まれ、州の選択にロードされます(市区町村の選択に移入するために州IDに基づいて都市を返却するためにビューをプラグインする必要があります)。

ウィジェットを設定する必要があります。メディアの内部クラスポイントは、両方の選択を連想させる特定の.jsファイルに設定する必要があります。

ModelAdmin仕様では、フィールドのウィジェットを作成したカスタムウィジェットに設定すると、メディアが自動的にchange_formテンプレートに追加されます。

.jsファイルが通常のJQueryオブジェクトを検索し、django.JQueryにフォールバックしていることを確認してください。この方法で、管理者とサイトの同じウィジェットを使用できます。

(function($) { 
// Note that this function works only for one widget per page 
$('#state').change(function(){ 
    $('#city').load('/cities_by_state/', {id: this.value}); // the endpoint returns HTML 
}); 
})(JQuery||django.JQuery); 

私は、私は私のプロジェクトのためにローカルで使用アプリ(3つの段階に可変の深さまで)に似た何かをやったし、それがページごとに複数のウィジェットをサポートするために持っていたとして、得られた溶液は、ダイナミック、毛深いビットを終わりましたウィジェット(インライン用)、さまざまな形式のウィジェットをレンダリングするためのテンプレートタグなど

+0

私はあなたのアプローチが好きでしたが、ドキュメンテーションにカスタムウィジェットを書く方法については何も見つかりません。カスタムウィジェットの例と提供例を教えてください。 – Raphael

1

管理者を曲げるのは簡単ではありませんが、本当に複雑なものではありますが、もうちょっとしたdjangoアプリです。私は通常次のようなことをします:

  1. Make a custom admin template for the model in question(change_form.htmlを上書きします)。
  2. State idでフィルタリングされたCityウィジェットを返すajax urlを作成します。
  3. 州が変更されたときにCityウィジェットを置き換えるには、jQueryのようなものを使用します。

Django管理者JavascriptはすでにjQueryライブラリを使用しています。ユーザースクリプトとの競合を避けるため、DjangoのjQueryはdjango.jQueryとして名前空間を使用しています。したがって、2番目のコピーを含める必要はありません。チェンジリストにdjango.jQueryオブジェクトを使用し、ビューを追加/編集できます。

関連する問題