PostGISとGeoDjangoを使ってLeafletでGeoJSON Tile Layerを表示してみる(3) – GeoDjangoの管理画面をカスタマイズ –

前回でGeoDjangoへのデータ登録が完了しましたので、ようやく管理画面から登録したデータを表示させてみましょう。Djangoと言えば、モデル定義だけすれば管理画面でCRUD操作ができてしまうというデータメンテなんて管理画面だけで充分だという人には嬉しい機能があります。それが地図オブジェクトでもできちゃうのだぜというのが今回の記事です。

標準の管理画面を表示させてみる

それでは、早速標準の管理画面を表示させてみましょう。

$ vi demo/admin.py
from django.contrib.gis import admin
from demo.models import Border

admin.site.register(Border, admin.GeoModelAdmin)
$ vi geodjango/urls.py
from django.conf.urls import patterns, include, url
from django.contrib.gis import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
)

最後に、管理画面にアクセスするユーザを作成します。ここではadminという名前にしました。Emailは適当でOKです。

$ python manage.py createsuperuser
Username (leave blank to use 'vagrant'): admin
Email address: admin@hohgoe.hoge
Password:****
Password (again):****
Superuser created successfully.

いよいよ、起動します。なお引数指定しないとlocalhost:8000しかアクセスできません。

$ python manage.py runserver 0.0.0.0:8000
Performing system checks...

System check identified no issues (0 silenced).
December 11, 2014 - 16:57:50
Django version 1.7.1, using settings 'geodjango.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

ブラウザから「http://x.x.x.x:8000/admin/」にアクセスしてみましょう。

ログイン画面がでるので先程作成したユーザ「admin」でログイン

ADMIN_1

「行政区域一覧」をクリックします。

ADMIN_2

「行政区域」の一覧が表示されました。

なお、「行政区域一覧」や「行政区域」という名称は前回モデルクラス定義の際にMetaクラスで指定したものになります。こちらを指定しない場合はそれぞれ「Borders」「Border」とクラス名で表示されます。

任意の行政区域をクリックします。

ADMIN_3

こんな感じでポリゴンを地図上で編集できるようになります。

ADMIN_4

ほとんど何もしてないのに地図上で編集できるとか恐ろしい子です、GeoDjangoちゃんは。でも、登録データ数が多いと、ページネーションだけで目的のデータを探すのは正直イケてないですよね(今回の画像例も大変でした)。また、デフォルトの地図編集画面もちょっと淋しげ。このまま管理画面を使えというのはちょっと忍びない感じですので、カスタマイズしてみましょう。

カスタマイズした管理画面を表示させてみる

今回は、地図編集画面のカスタマイズと、モデルの検索とフィルタ機能を追加してみます。
Djangoにはプラグインという機構があり、有志が色々と便利なものを公開しているようです。GeoDjangoについても、今回いくつか使ってみることにします。ここでは地図表示関連をカスタマイズするためにdjango-leafletというものを使ってみました(管理画面だけでいうとOSMGeoAdminというものもあるのですが、今回はあえてLeaflet使いました)。

django-leafletのインストール

pipでインストール。

$ sudo pip install django-leaflet
Downloading/unpacking django-leaflet
  Downloading django-leaflet-0.15.1.tar.gz (199kB): 199kB downloaded
  Running setup.py (path:/tmp/pip_build_root/django-leaflet/setup.py) egg_info for package django-leaflet

Requirement already satisfied (use --upgrade to upgrade): Django in /usr/local/lib/python2.7/dist-packages (from django-leaflet)
Installing collected packages: django-leaflet
  Running setup.py install for django-leaflet

Successfully installed django-leaflet
Cleaning up...

django-leafletの有効化

プロジェクト設定を編集してプラグインを追加します。

$ vi geodjango/settings.py

以下の一行をINSTALLED_APPSの末尾に追加します。

INSTALLED_APPS = (
    'django.contrib.gis', 
    'demo',               
    'leaflet', # add
)

地図編集画面を切り替える為に以下を書きかえます。

$ vi demo/admin.py
from django.contrib.gis import admin
from demo.models import Border
from leaflet.admin import LeafletGeoAdmin

admin.site.register(Border, LeafletGeoAdmin)

GeoModelAdminに代わってLeafletGeoAdminを登録します。
これで、地図編集画面が変更されました。

検索・フィルタ機能の追加

引き続き、管理画面に行政区域の検索・フィルタ機能を追加します。

$ vi demo/admin.py
from django.contrib.gis import admin
from demo.models import Border
from leaflet.admin import LeafletGeoAdmin

class BorderAdmin(LeafletGeoAdmin):
  search_fields = ['n03_001','n03_003','n03_004']
  list_filter = ('n03_001', )

admin.site.register(Border, BorderAdmin)

LeafletGeoAdminを継承したBorderAdminクラスを定義し、「search_fields」と「list_filter」を定義します。「search_fields」で定義されているフィールドが検索対象になります。「list_filter」で定義されているフィールド名がフィルタ対象となります。
最後に、LeafletGeoAdminに代わって定義したクラスを登録します。

それでは一度サーバを落として再起動して、ブラウザでログインしてみましょう。
行政区域の一覧画面に検索フィールドと都道府県フィルターが追加されました。

ADMIN_5

試しに検索フィールドに「浦和」を入れたらすぐに検索されました。

ADMIN_6

行政区域をクリックすると先程よりは若干豪華な地図画面が表示されました(ベースマップがOSMになったせいですが)。こちらがdjango-leafletの効果です。ポリゴン編集も標準よりはやりやすい気がします(個人的に)。

ADMIN_7

なお、django-leafletは管理画面以外にも色々と便利な機能があると思いますが、今回は使ってないので気になる人は以下リンクを参照ください。

django-leaflet

次はGeoJSONを出力させてみることにましょう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*