diff --git a/season-01.md b/season-01.md index bab06c9..8468f9f 100644 --- a/season-01.md +++ b/season-01.md @@ -6,6 +6,7 @@ 2. نصب پکیج جنگو 3. ایجاد پروژه 4. دستور migrate +5. اجرای سرور #### 1. ایجاد محیط مجازی @@ -166,3 +167,18 @@ django-admin startproject project_name ```powershell python manage.py migrate ``` +#### 5. اجرای سرور +با استفاده از دستور runserver، سرور در IP و پورت پیش فرض(Localhost) اجرا می شود. + +``Terminal:`` + +```powershell +python manage.py runserver +``` +در صورت اشفال بودن IP یا پورت، میتوان از دستور زیر نیز برای تعریف IP و پورت استفاده نمود. + +``Terminal:`` + +```powershell +python manage.py runserver 127.0.0.2:7000 +``` diff --git a/season-02.md b/season-02.md index e2dc275..de228a3 100644 --- a/season-02.md +++ b/season-02.md @@ -66,7 +66,9 @@ class TableName(models.Model): ``` برای متن های طولانی تر از «TextField» بجای «CharField» استفاده میکنیم. -هر صفحه ای از وبسایت دارای «url» خاص خودشه آن میشه slug.(قسمت اصلی آدرس بعد از نام دامنه است) + +هر صفحه ای از وبسایت دارای «url» خاص خودش می باشد که به آن slug می گویند.(قسمت اصلی آدرس بعد از نام دامنه است) برای ذخیره slug از فیلد «SlugField» استفاده میشود. + برای زمان و تاریخ از فیلد «DateTimeField» استفاده میکنیم. مرتب سازی آبجکت ها در جدول: @@ -243,6 +245,9 @@ class Post(models.Model): اتریبیوت labels: اسامی که به کاربر نمایش داده میشه را برمیگرداند +یکی از بهترین راه های برقراری ارتباط با کد هایی که مینویسیم استفاده از shell می باشد. + + ``Terminal:`` ```powershell @@ -372,7 +377,9 @@ class Post(models.Model): برای اینکه جداول توی دیتابیس ذخیره بشن از «makemigrations» و «migrate» استفاده میکنیم دستور migrate : مسئول اعمال و عدم اعمال مهاجرت(migration) است. + دستور makemigrations : مسئول ایجاد مهاجرت(migration) های جدید بر اساس تغییراتی است که در مدل های خود ایجاد کرده اید. + دستور sqlmigrate، : دستورات SQL را برای یک مهاجرت(migration) نمایش می دهد. با استفاده از دستور «makemigrations» چنانچه تغییری توی مدل اعمال شده باشد میاد و یک (migration) حاوی تغییرات جهت اعمال روی دیتابیس ایجاد میکند با این حال تغییری روی دیتابیس نمیدهد / هنگامی که از دستور «migrate» استفاده کنیم تغییرات روی دیتابیس اعمال میشن. @@ -571,11 +578,11 @@ class PostAdmin(admin.ModelAdmin): اینها چهار عملکرد اصلی برای کار با پایگاه داده هستند. مثلا یک داده به جدول اضافه کنیم، -یک یا چند مورد از داده ها انتخاب کنیم(از روی دیتابیس بخوانیم) -تغییراتی توی داده ایجاد کنیم +یک یا چند مورد از داده ها انتخاب کنیم(از روی دیتابیس بخوانیم)، +تغییراتی توی داده ایجاد کنیم، ویا داده هایی را از دیتابیس حذف کنیم. -این عملکردها را با ORM» انجام میدهیم. +این عملکردها را با (ORM) انجام میدهیم. --- @@ -688,9 +695,28 @@ python manage.py shell --- -ایجاد داده در جدول دیتابیس ، با استفاده از متد create() - برای «user» بهتره از متد خاص خودش یعنی create_user() استفاده کنیم (در این روش دیگر نیازی به متد save() نیست): +با استفاده از متد create() میتوان بدون استفاده از متد save()، یک query به صورت مستقیم ایجاد و در دیتابیس ذخیره کرد + +خب حالا بریم یک پست جدید ایجاد کنیم: + +``shell:`` + +```shell +>>> Post.objects.all() +]> +>>> post1 = Post.objects.create(author=user2, title='Django', description='Django is a free and open source web-based software framework') +>>> post1 + +>>> Post.objects.all() +, ]> +``` + +چون فیلد (author) از نوع (ForeignKey) هست بهتره از (user) ایجاد کرده استفاده کنیم نه رشته / مابقی فیلد ها هم پر میکنیم. + +از متد create میتوان بدون ذخیره در یک متغیر نیز، استفاده کرد. + +برای «user» بهتره از متد خاص خودش یعنی create_user() استفاده کنیم (در این روش دیگر نیازی به متد save() نیست): ```python # structure @@ -709,22 +735,6 @@ User.objects.create_user() , , ]> ``` -خب حالا بریم یک پست جدید ایجاد کنیم: - -``shell:`` - -```shell ->>> Post.objects.all() -]> ->>> post1 = Post.objects.create(author=user2, title='Django', description='Django is a free and open source web-based software framework') ->>> post1 - ->>> Post.objects.all() -, ]> -``` - -چون فیلد (author) از نوع (ForeignKey) هست بهتره از (user) ایجاد کرده استفاده کنیم نه رشته / مابقی فیلد ها هم پر میکنیم. - --- **متد get():** برای دریافت یک (object) از جدول (منطبق با شرایطی که در دستور برایش مشخص میکنیم) استفاده میشه. @@ -756,6 +766,8 @@ User.objects.create_user() **متد get_or_create():** +``shell:`` + ```shell >>> Post.objects.get_or_create(author_id=1, title='C language') (, True) @@ -770,10 +782,30 @@ User.objects.create_user() خروجی آن (کوئری ست) هستش. +``shell:`` + ```shell >>> Post.objects.filter(title='Django') ]> ``` +با استفاده از 2 تا underscore(__) میتوان فیلد های عناصر مشخص کننده در متد را مشخص کرد + +مثال ها + +``shell:`` + +```shell +>>> posts1 = Post.objects.filter(user__id=2) +>>> posts1 +]> +>>>posts2 = Post.object.filter(publish__year=2023) +>>>posts2 +, ]> +>>>Post.object.filter(publish__year=2022, author__username="reza") +]> +>>>Post.object.filter(publish__year=2024).filter(author__username="ali") +]> +``` --- @@ -1160,6 +1192,8 @@ from . import views app_name = 'blog' urlpatterns = [ + # path("URL-name-page+/",views.view-page-method,name='name for better access to URL') + # URL For index page path('', views.index, name='index'), # URL For Post-Detail @@ -1179,7 +1213,7 @@ urlpatterns = [ #### کاربرد (app_name) و (name) در فایل (url) -اگه خواستیم از (url) که ایجاد کرده ایم در جایی استفاده کنیم بجای نوشتن آن آدرس طولانی به صورت زیر عمل میکنیم: +اگر در پروژه، چند اپلیکیشن داشتیم برای دسترسی راحت تر به urlهای هر اپلیکیشن میتوان برای فایل های (urls.py) آنها یک namespace (app_name) تعریف کنیم و بجای نوشتن آن آدرس طولانی به صورت زیر عمل میکنیم: app_name: (name in path) @@ -1187,12 +1221,14 @@ blog: post_list --- -الآن این (url)ها کار نمیکنند ما باید یکسری تغییرات توی فایل (urls.py) پروژه نه دایرکتوری اپ ایجاد کنیم (باید فایل urls.py اپ را بهش معرفی کنیم) +الآن این (url)ها کار نمیکنند ما باید یکسری تغییرات توی فایل (urls.py) پروژه (نه دایرکتوری اپ) ایجاد کنیم (باید فایل urls.py اپ را بهش معرفی کنیم) ```python path('خالی یا یک آدرس', include('آدرس فایل url اپ', namespace="اسم اپ")) ``` +مقدار path بالا باید درون لیست urlpatterns فایل urls.py خود پروژه اضافه شود، همچنین باید include نیز به این فایل import شود. + برای درک بیشتر به کد زیر توجه کنید. `project directory/urls.py` diff --git a/season-03.md b/season-03.md index 8b374c1..90afcb4 100644 --- a/season-03.md +++ b/season-03.md @@ -212,12 +212,71 @@ class Post(models.Model): {% block content %}

جزئیات پست

{{ post.title }} توسط {{ post.author }}

-

{{ post.description | linebreaks }}

+

{{ post.description |linebreaks }}


-

{{ post.publish | jformat }}

+

{{ post.publish |jformat|"%Y/%m/%d-%H:%M" }}

{% endblock %} ``` +مقادیر فرمت دهی جلالی براساس ماژول datetime پایتون می باشند(نه فیلترهای جنگو!!(date و time)). + +برای کامنت گذاری در تمپلیت های جنگو باید از تگ {# text #} استفاده کرد. + ### نتیجه‌گیری با اعمال تغییرات ذکر شده، پنل ادمین پروژه جنگو به زبان فارسی قابل استفاده خواهد بود. همچنین تاریخ و زمان با تاریخ جلالی به شمسی تبدیل خواهد شد(به زبان فارسی) + +--- + +## استفاده و فرمت دهی زمان در تمپلیت ها + +برای استفاده از ماژول datetime در پروژه کافیست این ماژول را در فایل "views.py" وارد کنیم و یک object در context برای آن ایجاد کنیم. + + +برای مثال) + +``app directory/views.py:`` + +```python +... +import datetime +def post_detail(request, id): + post = get_object_or_404(Post, id=id, status=Post.Status.PUBLISHED) + context = { + "post": post, + "new_date": datetime.datetime.now(), + } + return render(request, "blog/post_detail.html", context) +``` + +حال میتوان از آن در تمپلیت ها نیز استفاده کرد + +``app directory/templates/blog/post_detail.html`` + +``` + ... +

{{ new_date }}

+ ... +``` + +میتوان از فیلتر date و مقادیر آن، برای فرمت دهی تاریخ استفاده کرد. + +```jinja +

{{ new_date |date }}

+

{{ new_date |date:"DATE_FORMAT" }}

+

{{ new_date |date:"DATETIME_FORMAT" }}

+

{{ new_date |date:"SHORT_DATE_FORMAT" }}

+

{{ new_date |date:"SHORT_DATETIME_FORMAT" }}

+``` +فرمت های تعریف شده برای date + +```jinja +

{{ new_date |date:"سال:Y ماه:m" }}

+``` + + +میتوان برای date مقادیر دلخواهی را قرار داد. + +از فیلتر time و مقادیر آن هم میتوان برای فرمت دهی ساعت استفاده کرد. + +برای مطالعه بیشتر می توانید داکیومنت این بخش را بخوانید.