آموزش پایتون

آموزش ساخت App جدید در Django

مراحل ساخت اپ جدید در جنگو :

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

اگر از pycharm بعنوان IDE پروژه تون استفاده می کنید، برای جلوگیری از ایجاد خطای no module named، حتما مطلب مربوط به رفع این خطای no module named در pycharm رو بخونید.

۱- ایجاد ساختار اپلیکیشن در جنگو

ابتدا با استفاده از دستور زیر به جنگو میگیم که ساختار اپلیکیشن ما رو در ایجاد کنه (البته بجای عبارت appname اسم اپی که میخواهید ایجاد کنید رو باید بنویسید. مثلا blog یا مثلا job )
(دقت کنید هر جا میخوایم از دستور manage.py استفاده کنیم، میبایست خط فرمان رو در مسیر حاوی فایل manage.py اجرا کنیم. )

python manage.py startapp appname

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

۱-۲- شناسوندن فایل اجرایی پایتون (که داخل venv هست) به pyCharm

در حالت عادی، pyCharm بیشعور میاد و از نسخه اصلی پایتون که در سیستم عامل شما نصب شده برای تفسیر پروژه استفاده می کنه.

و چون اون نسخه از پایتون احتمالا ماژولهاش با ماژ>لهایی که شما روی venvنصب کردید فرق می کنه، از همه ماژولهای نصب شده شما (من جمله جنگو) ایراد می گیره.

برای رفع این مشکل، باید نسخه پایتون داخل venv پروژه خودتون رو بعنوان مفسر (interpreter) پروژه تون به pyCharm معرفی کنین.

  • در pyCharm از منوی file گزینه setting رو بزنید.
  • در پنجره تنظیمات، عبارت interpreter رو سرچ کنید.
  • با کلیک بر روی آیکن چرخ دنده که در سمت راست دراپ داون اومده، گزینه add رو بزنید.
  • روی گزینه Existing environment کلیک کنید و در دراپ داون زیر اون، آدرس فایل پایتون داخل venv/bin داخل روت پروژه تون رو بهش بدین
  • روی Apply و OK کلیک کنید.

۲- ایجاد کلاس اصلی اپ (برای ایجاد جدول مربوطه در دیتابیس)

در این مرحله کلاس اصلی اپ خودمون رو در فایل models.py (که داخل روت اپ قرار داره) ایجاد می کنیم. این کلاس باعث ایجاد یک جدول جدید در دیتابیس با نام همان کلاس خواهد شد.

و فیلدهایی که داخل این کلاس تعریف می کنیم، فیلدهای تیبل (clumn های جدول) خواهد بود.

در صورت اضافه کردن اپ به داشبورد ادمین، این فیلدها در قسمت ادمین جنگو نیز به شما نمایش داده خواهد شد. (این مورد را در شماره ۸ همین مطلب آموزش دادم)

# در اینجا کلاس اصلی اپ رو ایجاد می کنیم 
# فیلد های این کلاس، فیلدهای تیبل مربوطه در دیتابیس رو مشخص می کنه 
class Job(models.Model):
    # ایمیج فیلد یکی از انواع فایل فیلد های جنگو هستش 
    #برای دیدن داکیومنت های انواغ فیلد های جنگو، عبارت زیر رو در گوگل سرچ کنید 
    # google this: django model fields 
    # داکیومنت های مربوط به فایل فیلدهای جنگو هم از آدرس زیر قابل دسترس هست. ایمیج فیلد هم دقیقا با فرمت فایل فیلد ایجاد میشه
    # https://docs.djangoproject.com/en/3.1/ref/models/fields/#filefield
    image = models.ImageField(upload_to='images/')
    summary = models.CharField(max_length=200)
    
    

در مثال فوق، برای اپ خودمون یک کلاس یه اسم Jobs نوشتیم که این کلاس دوتا فیلد داره. یکی فیلم image و یکی هم فیلد خلاصه یا summery.

در این داکیومنت میتونید انواع فیلد های جنگو رو ببینید.

۳- شناساندن App به جنگو

ما باید اپلیکیشن خودمون رو به جنگو معرفی کنیم که اصلا بفهمه همچین اپی وجود خارجی داره.


برای این کار وارد فولدر اصلی پروژه (زیرمجموعه روت) میریم و فایل settings.py رو باز می کنیم.و به قسمت INSTALLED_APPS میریم. همونطور که می بینید در این قسمت اپ های پیشفرض نصب شده روی جنگو (مثل admin , auth , sessions , messages و غیره) در یک لیست نوشته شدن.


حالا برای آموزش ما فرض می کنیم که اسم اپ مورد نظر،jobs باشه . به فولدر اپ jobs میریم و apps.py رو باز می کنیم. در این فایل یک اسم کلاس به صورت خودکار ایجاد شده که شامل اسم اپ و کلمه Config میشه. اسم این کلاس رو کپی می کنیم (مثلا JobsConfig)


حالا به فایل settings.py بر می گردیم و عبارت زیر رو به لیست INSTALLED_APPSاضافه می کنیم. اینجوری:

INSALLED_APPS=[
	'jobs.apps.JobConfig',
]

۴- شناساندن فولدر برای آپلود فایلهای صوتی تصویری به جنگو

برای این کار باید MEDIA_ROOT رو به جنگو معرفی کنیم. برای معرفیش، دستور با فرمت زیر رو در فایل settings.py و معمولا در خط بعد از دستور STATIC_URL می نویسیم:

MEDIA_ROOT = BASE_DIR / 'media'

در فرمت بالا، یک فولدر به نام media در روت پروژه ایجاد شده و فایلهای صوتی تصویری در آن ذخیره خواهند شد. در صورت نیاز می توانید بجای media از اسم مورد نظر خودتون استفاده کنید که جنگو فایلهای مذکور رو در اون فولدر ذخیره کنه.

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

فقط توجه کنید که در کل آدرس باید داخل کوتیشن قرار بگیره و با فرمت استرینگ وارد بشه. مثلا:

MEDIA_ROOT = '192.168.32.54/files/music'

۴-۱- شناساندن فولدر استاتیک به جنگو

با همون فرمتی که MEDIA_ROOT رو ایجاد کردیم، SATAIC_ROOT رو هم ایجاد می کنیم. (اون رو دز سطر قبل از STATIC_URL می نویسیم)

آدرسی که در قطعه کد زیر بهش دادیم، به فولدر استاتیک در روت پروژه اشاره می کنه.

STATIC_ROOT = BASE_DIR / 'static'
STATIC_URL = '/static/'

۵- تعیین آدرس دانلود و نمایش فایلهای صوتی تصویری در مرورگر

فرض کنید که ما تصاویرمون رو توی فولدر images ریختیم، اما خب قطعا نمیخوایم موقع نشون دادن تصاویر به کاربر، آدرس پوشه واقعیمون رو به کاربر نشون بدیم. و میخوایم از طریق یک url فیک، تصاویر رو برای کاربر بفرستیم.

اون آدرس از طریق دستور زیر تعیین میشه. این دستور رو هم بعد از دستور قبلی (MEDIA_ROOT) می نویسیم.

MEDIA_URL = '/media/' 

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

بعد از اون هم نوبت به این میرسه که این آدرس رو به فایل urls.py که در روت پروژه قرار داره معرفی کنیم.


فایل urls.py رو باز می کنیم و اول دوتا ایمپورت توش انجام میدیم و بعد هم آدرس رو با یک علامت + به قسمت urlpattens اضافه می کنیم. فایل urls.pyبه صورت زیر درمیاد:

from django.contrib import admin
from django.urls import path
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)


۶- مایگریت کردن اپ های پیشفرض به دیتابیس

هر وقت پروژه جدید ایجاد کردین، یا دیتابیس پروژه رو عوض کردین (مثلا از sqlite به postgre رفتین)، وقتی سرور رو با استفاده از دستور puthon manage.py runserver اجرا کنید، یک وارنینگ دریافت می کنید که نوشته شما تعدادی مایگریشن دارید که انجام نشد و برای انجام مایگریشن دستور python manage.py migrate رو باید بزنید تا این مایگریشن انجام بشه.


خب شما هم بعد از اینکه تنظیمات مربوط به اپ ها تون رو انجام دادید، همین دستور رو بزنید تا مایگریشن انجام بشه براتون:

python manage.py migrate 

۷- مایگریت کردن اپ هایی که توسط خودتون به پروژه اضافه شده

برای این کار باید بعد از اینکه اپ ها رو به جنگو شناسوندین (که چند پاراگرف بالاتر کامل توضیحش دادم)، و دیپندنسی های لازم رو هم نصب کردین (مثلا اگر توی اپ از فیلد image استفاده کردین، باید حتما pillow رو هم نصب کنید که جنگو بتونه با تصاویر کار کنه) بعدش دستور زیر رو می زنین تا مایگریشن اپ های جدید شما هم به دیتابیس انجام بشه.
در حقیقت تیبل ها و فیلدهای اپ شما، در دیتابیس ایجاد میشه:

python manage.py makemigrations 

دقت کنید هر وقت هر تغییری در کاس و یا فیلد های کلاس اپ خودتون ایجاد کردید (مثلا اسم فیلد رو عوض کردین یا فیلد جدید اضافه کردین) می بایست makemigration رو انجام بدین که تغییرات توی دیتابیس هم اتفاق بیوفته.

حالا باید یکبار دیگه مایگریت رو روی پروژه انجام بدیم که اپ مون رو بشناسه :

python manage.py migrate

۸- اضافه کردن اپ به داشبورد ادمین

بعضی از اپ ها نیازی به نمایش فیلدها و رکورد ها در بخش ادمین ندارن و در پس زمینه فعالیت می کنن (مثل اپ های محاسباتی و غیره)


اما بیشتر اپ هایی که ما می نویسیم، نیاز به مدیریت از قسمت ادمین دارن. و میخوایم نتیجه اون اپ و رکوردهایی که دراون اپ وارد شده رو به ادمین نشون بدیم و مدیریت اونها رو به ادمین بسپاریم.

مثل یه ماژول مستندات که میخوایم فیلد ها و مقادیرش در قسمت ادمین در دسترس باشه.
در حالت عادی وقتی ما اپ رو می نویسیم، به ازای اون چیزی در قسمت ادمین اضافه نمیشه.


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


برای این کار، ابتدا باید این کلاس رو از فایل models.py ایمپورت کنیم. پس داخل فایل admin.py که داخل فولدر اپ هست می نویسیم:

from .models import Job 

(مثلا Job اسم کلاسمون هستش)
و بعد می نویسیم :

 admin.site.register(Job) 

و تمام! حالا در قسمت ادمین، این اپ رو خواهید دید.

حامد عسکریان

برنامه نویس و عاشق تکنولوژی

دیدگاهتان را بنویسید

دکمه بازگشت به بالا
بستن
بستن