From c9e0e28abe041a0038a2017fe565f91056fbf7d6 Mon Sep 17 00:00:00 2001 From: Mohsen Darabi Date: Fri, 20 Sep 2024 17:42:15 +0330 Subject: [PATCH 1/6] Update season-01.md Adding the fifth step to the file --- season-01.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) 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 +``` From 22a982c8915d69bb3888ccb4b45ee6aacd9f7a4a Mon Sep 17 00:00:00 2001 From: Mohsen Darabi Date: Sat, 21 Sep 2024 13:45:57 +0330 Subject: [PATCH 2/6] Update season-02.md --- season-02.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/season-02.md b/season-02.md index e2dc275..cfb5869 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 From 1fefb822f5ac991fdc39440950eaf4e40d198dd6 Mon Sep 17 00:00:00 2001 From: Mohsen Darabi Date: Sun, 22 Sep 2024 20:41:57 +0330 Subject: [PATCH 3/6] Update season-02.md update filter method and ... --- season-02.md | 61 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/season-02.md b/season-02.md index cfb5869..885d284 100644 --- a/season-02.md +++ b/season-02.md @@ -377,7 +377,9 @@ class Post(models.Model): برای اینکه جداول توی دیتابیس ذخیره بشن از «makemigrations» و «migrate» استفاده میکنیم دستور migrate : مسئول اعمال و عدم اعمال مهاجرت(migration) است. + دستور makemigrations : مسئول ایجاد مهاجرت(migration) های جدید بر اساس تغییراتی است که در مدل های خود ایجاد کرده اید. + دستور sqlmigrate، : دستورات SQL را برای یک مهاجرت(migration) نمایش می دهد. با استفاده از دستور «makemigrations» چنانچه تغییری توی مدل اعمال شده باشد میاد و یک (migration) حاوی تغییرات جهت اعمال روی دیتابیس ایجاد میکند با این حال تغییری روی دیتابیس نمیدهد / هنگامی که از دستور «migrate» استفاده کنیم تغییرات روی دیتابیس اعمال میشن. @@ -576,11 +578,11 @@ class PostAdmin(admin.ModelAdmin): اینها چهار عملکرد اصلی برای کار با پایگاه داده هستند. مثلا یک داده به جدول اضافه کنیم، -یک یا چند مورد از داده ها انتخاب کنیم(از روی دیتابیس بخوانیم) -تغییراتی توی داده ایجاد کنیم +یک یا چند مورد از داده ها انتخاب کنیم(از روی دیتابیس بخوانیم)، +تغییراتی توی داده ایجاد کنیم، ویا داده هایی را از دیتابیس حذف کنیم. -این عملکردها را با ORM» انجام میدهیم. +این عملکردها را با (ORM) انجام میدهیم. --- @@ -693,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 @@ -714,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) از جدول (منطبق با شرایطی که در دستور برایش مشخص میکنیم) استفاده میشه. @@ -779,6 +784,20 @@ User.objects.create_user() >>> Post.objects.filter(title='Django') ]> ``` +با استفاده از 2 تا underscore(__) میتوان فیلد های عناصر مشخص کننده در متد را مشخص کرد +مثال ها +```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") +]> +``` --- From a4a575db43d1095a543a7cebd7701a54b23c8ab3 Mon Sep 17 00:00:00 2001 From: Mohsen Darabi Date: Sun, 22 Sep 2024 20:46:55 +0330 Subject: [PATCH 4/6] Fix typing mistake season-02.md --- season-02.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/season-02.md b/season-02.md index 885d284..7ced5ba 100644 --- a/season-02.md +++ b/season-02.md @@ -785,6 +785,7 @@ User.objects.create_user() ]> ``` با استفاده از 2 تا underscore(__) میتوان فیلد های عناصر مشخص کننده در متد را مشخص کرد + مثال ها ```shell >>> posts1 = Post.objects.filter(user__id=2) @@ -795,7 +796,7 @@ User.objects.create_user() , ]> >>>Post.object.filter(publish__year=2022, author__username="reza") ]> ->>>>>>Post.object.filter(publish__year=2024).filter(author__username="ali") +>>>Post.object.filter(publish__year=2024).filter(author__username="ali") ]> ``` From e0e18069e092c6ad4c4c4dff68756fa74f6c5e9b Mon Sep 17 00:00:00 2001 From: Mohsen Darabi Date: Sun, 22 Sep 2024 23:37:49 +0330 Subject: [PATCH 5/6] Update season-02.md --- season-02.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/season-02.md b/season-02.md index 7ced5ba..de228a3 100644 --- a/season-02.md +++ b/season-02.md @@ -766,6 +766,8 @@ User.objects.create_user() **متد get_or_create():** +``shell:`` + ```shell >>> Post.objects.get_or_create(author_id=1, title='C language') (, True) @@ -780,6 +782,8 @@ User.objects.create_user() خروجی آن (کوئری ست) هستش. +``shell:`` + ```shell >>> Post.objects.filter(title='Django') ]> @@ -787,6 +791,9 @@ User.objects.create_user() با استفاده از 2 تا underscore(__) میتوان فیلد های عناصر مشخص کننده در متد را مشخص کرد مثال ها + +``shell:`` + ```shell >>> posts1 = Post.objects.filter(user__id=2) >>> posts1 @@ -1185,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 @@ -1204,7 +1213,7 @@ urlpatterns = [ #### کاربرد (app_name) و (name) در فایل (url) -اگه خواستیم از (url) که ایجاد کرده ایم در جایی استفاده کنیم بجای نوشتن آن آدرس طولانی به صورت زیر عمل میکنیم: +اگر در پروژه، چند اپلیکیشن داشتیم برای دسترسی راحت تر به urlهای هر اپلیکیشن میتوان برای فایل های (urls.py) آنها یک namespace (app_name) تعریف کنیم و بجای نوشتن آن آدرس طولانی به صورت زیر عمل میکنیم: app_name: (name in path) @@ -1212,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` From adbfcc8b69608e49e1a786fb6a3c7aea422d90f6 Mon Sep 17 00:00:00 2001 From: Mohsen Darabi Date: Tue, 24 Sep 2024 17:11:30 +0330 Subject: [PATCH 6/6] Update season-03.md --- season-03.md | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) 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 و مقادیر آن هم میتوان برای فرمت دهی ساعت استفاده کرد. + +برای مطالعه بیشتر می توانید داکیومنت این بخش را بخوانید.