استفاده از جداول شهر و کشور در پایتون / دیجنگو (جنگو)

با سلام و درود ، عید سعید فطر مبارک باشه (امروز ۱۵ خرداد ۹۸ مصادف با عید سعید فطر)، تو پروژه ای که دارم کار می کنم نیاز به شهر و کشور داخل مدل هام پیدا کردم. با یه جستجوی ساده این رو پیدا کردم. حال قصد دارم تو این مقاله قصد دارم با آموزش راه اندازی django-cities در خدمتتون باشم.

نصب django-cities :

قدم اول نصب با استفاده از pip که دستورش به شرح زیر است:

pip install django-cities

کانفیگ کردن:

خب به بخش سخت کار رسیدیم :)))

اول از همه باید GeoDjango را فعال کنید. تو این آموزش برای اینکار به نصب SpatiaLite پرداختیم.

نصب پایگاه داده

من از پایگاه داده Sqlite3 که همراه با Django نصب و پیشفرض تنظیم شده بود استفاده کردم. در نتیجه نیازی به نصب Sqlite3نداشتم. فقط برای استفاده از ویژگی های Spatioal و جغرافیایی در Sqlite3 نیاز به نصب موارد زیر دارید:

قدم اول نصب پکیج های libsqlite3-mod-spatialite با دستور :

sudo apt install libsqlite3-mod-spatialite

تو پرانتز بگم که مشخصه من دارم روی لینوکس موارد فوق رو نصب می کنم و آموزش برای کاربران لینوکسی مفید خواهد بود.

خب حالا باید تست کنیم که SQLite با  R*Tree module کامپایل شده یا خیر. برای این منظور پس از اجرای sqlite3 command line interface دستور زیر رو بزنید:

sqlite3 mydata.db 
CREATE VIRTUAL TABLE testrtree USING rtree(id,minX,maxX,minY,maxY);

اگر به اروری بر نخورید تا اینجا کارها درست پیش رفته 🙂

اگر به اروری بر خوردید باید Sqlite ا مجدد از روی سورس کامپایل کنید. برای این کار اول sqlite و از روی سورس نصب کنید :

 wget https://www.sqlite.org/YYYY/sqlite-amalgamation-XXX0000.zip
 unzip sqlite-amalgamation-XXX0000.zip
 cd sqlite-amalgamation-XXX0000

حال اسکریپت کانفیگ رو اجرا کنید:

 CFLAGS="-DSQLITE_ENABLE_RTREE=1" ./configure
 make
 sudo make install
 cd ..

کتابخانه (libspatialite):SpatiaLite

این قسمت رو برای کسانی گذاشتم که مراحل بعد از این مرحله رو رفتندو به مشکل برخوردند. خودم مشکل داشتم و این سورس رو نصب کردم و بعد رفتم سراغ مراحل بعدی 🙂

آخرین سورس کتابخانه فوق رو از این آدرس باید دریافت کنید. الان که من دارم این مقاله رو مینویسم آخرین نسخ 4.4.0-RC1

ز دستورات زیر استفاده کنید :

 wget https://www.gaia-gis.it/gaia-sins/libspatialite-sources/libspatialite-4.4.0-RC1.tar.gz

tar xaf libspatialite-4.4.0-RC1.tar.gz 

cd libspatialite-4.4.0-RC1

./configure

make

sudo make install

اگر حین اجرای دستوریconfigureه ارور زیر برخورد کردید:

configure: error: cannot find proj_api.h, bailing out

این دو دستور را ابتدا اجرا کنید و مجدد onfigureو ادامه دستورات:

sudo apt-get update
sudo apt-get install libproj-dev

اگر به ارور ذیل برخوردید :

configure: error: cannot find freexl.h, bailing out

کافیه این پکیج را نصب کنید :

sudo apt-get install libfreexl-dev 

باز اگر به ارور زیر برخوردید:

configure: error: ‘libxml2’ is required but it doesn’t seem to be installed on this system.

پکیج libxml2-dev را نصب کنید :

sudo apt-get install libxml2-dev

تنظیمات پایگاه داده :

در حال حاضر GeoDjango از backend های زیر پشتیبانی می کنه:

  • django.contrib.gis.db.backends.postgis
  • django.contrib.gis.db.backends.mysql
  • django.contrib.gis.db.backends.oracle
  • django.contrib.gis.db.backends.spatialite

مشخصه که با توجه به توضیحات قبلیم و استفاده از Sqlite3 مورد آخر به کار من میاد. پس وارد settings.py میشم و از قسمت DATABASES موتور پایگاه داده ام را اصلاح میکنم، به شکل زیر :

DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.spatialite',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

پس شما ام با توجه به پایگاه داده ای که استفاده می کنید، Backendخود را اصلاح کنید.

حال  django.contrib.gis را به INSTALLED_APPS در setting.py اضافه کنید (حواستون به کامای بعد کوتیشن «’» باشه)

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'web',
    'django.contrib.gis',
]

حال نوبت به اضافه کردن cities به INSTALLED_APPS در Setting.pyپروژه تان رسیده است:

INSTALLED_APPS = (
    # ...
    'cities',
    # ...
)

import confiuration

خب برای توضیحات این بخش بهتره به اینجا یه نگاهی بیاندازید، منتهی من خودم این تنظیمات رو داخل settings.py اعمال کردم (این تنظیمات دلخواهی هستند):

CITIES_POSTAL_CODES = ['ALL']
CITIES_LOCALES = ['ALL']
CITIES_VALIDATE_POSTAL_CODES = True
# Import cities without region (default False)
CITIES_SKIP_CITIES_WITH_EMPTY_REGIONS = True
# CITIES_LOCALES = ['c', 'und', 'LANGUAGES']
CITIES_LOCALES = ['ALL']
CITIES_POSTAL_CODES = ['US', 'IR']

حال دستور زیر رو اجرا کنید :

python manage.py cities --import=all

فقط برای import کردن بهتره که به پ ی ل ت ر ش ک ن وصل باشید تا هنگام دریافت اطلاعات به مشکل بر نخورید و امکان داره import کردن چند دقیقه ی طول بکشه، صبر داشته باشید 🙂

خب نصب و راه اندازی تموم شد، برای تست می تونید از مثال های صفحه گیت هاب پروژه django-cities استفاده کنید یا برای مثال داخل models.py از کتابخانه cities دو تا چجیز رو import کنید و پروژه را با runserver اجرا کنید و ببینید با قدم اول یعنی نصب درست کتابخانه و شناساندنش مشکل نداشته باشید.

آموزش بعدی ان شاالله از این کتابخانه برای انتخاب شهر و کشور در هنگام آدرسی دهی از سمت کاربر استفاده می کنم.