Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update s123 #17

Open
wants to merge 6 commits into
base: seasons-source
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions season-01.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
2. نصب پکیج جنگو
3. ایجاد پروژه
4. دستور migrate
5. اجرای سرور

#### 1. ایجاد محیط مجازی

Expand Down Expand Up @@ -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
```
84 changes: 60 additions & 24 deletions season-02.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,9 @@ class TableName(models.Model):
```

برای متن های طولانی تر از «TextField» بجای «CharField» استفاده میکنیم.
هر صفحه ای از وبسایت دارای «url» خاص خودشه آن میشه slug.(قسمت اصلی آدرس بعد از نام دامنه است)

هر صفحه ای از وبسایت دارای «url» خاص خودش می باشد که به آن slug می گویند.(قسمت اصلی آدرس بعد از نام دامنه است) برای ذخیره slug از فیلد «SlugField» استفاده میشود.

برای زمان و تاریخ از فیلد «DateTimeField» استفاده میکنیم.

مرتب سازی آبجکت ها در جدول:
Expand Down Expand Up @@ -243,6 +245,9 @@ class Post(models.Model):

اتریبیوت labels: اسامی که به کاربر نمایش داده میشه را برمیگرداند

یکی از بهترین راه های برقراری ارتباط با کد هایی که مینویسیم استفاده از shell می باشد.


``Terminal:``

```powershell
Expand Down Expand Up @@ -372,7 +377,9 @@ class Post(models.Model):
برای اینکه جداول توی دیتابیس ذخیره بشن از «makemigrations» و «migrate» استفاده میکنیم

دستور migrate : مسئول اعمال و عدم اعمال مهاجرت(migration) است.

دستور makemigrations : مسئول ایجاد مهاجرت(migration) های جدید بر اساس تغییراتی است که در مدل های خود ایجاد کرده اید.

دستور sqlmigrate، : دستورات SQL را برای یک مهاجرت(migration) نمایش می دهد.

با استفاده از دستور «makemigrations» چنانچه تغییری توی مدل اعمال شده باشد میاد و یک (migration) حاوی تغییرات جهت اعمال روی دیتابیس ایجاد میکند با این حال تغییری روی دیتابیس نمیدهد / هنگامی که از دستور «migrate» استفاده کنیم تغییرات روی دیتابیس اعمال میشن.
Expand Down Expand Up @@ -571,11 +578,11 @@ class PostAdmin(admin.ModelAdmin):
اینها چهار عملکرد اصلی برای کار با پایگاه داده هستند.

مثلا یک داده به جدول اضافه کنیم،
یک یا چند مورد از داده ها انتخاب کنیم(از روی دیتابیس بخوانیم)
تغییراتی توی داده ایجاد کنیم
یک یا چند مورد از داده ها انتخاب کنیم(از روی دیتابیس بخوانیم)،
تغییراتی توی داده ایجاد کنیم،
ویا داده هایی را از دیتابیس حذف کنیم.

این عملکردها را با ORM» انجام میدهیم.
این عملکردها را با (ORM) انجام میدهیم.

---

Expand Down Expand Up @@ -688,9 +695,28 @@ python manage.py shell

---

ایجاد داده در جدول دیتابیس ، با استفاده از متد <span class="en-text">create()</span>

برای «user» بهتره از متد خاص خودش یعنی <span class="en-text">create_user()</span> استفاده کنیم (در این روش دیگر نیازی به متد <span class="en-text">save()</span> نیست):
با استفاده از متد <span class="en-text">create()</span> میتوان بدون استفاده از متد <span class="en-text">save()</span>، یک query به صورت مستقیم ایجاد و در دیتابیس ذخیره کرد

خب حالا بریم یک پست جدید ایجاد کنیم:

``shell:``

```shell
>>> Post.objects.all()
<QuerySet [<Post: Python>]>
>>> post1 = Post.objects.create(author=user2, title='Django', description='Django is a free and open source web-based software framework')
>>> post1
<Post: Django>
>>> Post.objects.all()
<QuerySet [<Post: Python>, <Post: Django>]>
```

چون فیلد (author) از نوع (ForeignKey) هست بهتره از (user) ایجاد کرده استفاده کنیم نه رشته / مابقی فیلد ها هم پر میکنیم.

از متد create میتوان بدون ذخیره در یک متغیر نیز، استفاده کرد.

برای «user» بهتره از متد خاص خودش یعنی <span class="en-text">create_user()</span> استفاده کنیم (در این روش دیگر نیازی به متد <span class="en-text">save()</span> نیست):

```python
# structure
Expand All @@ -709,22 +735,6 @@ User.objects.create_user()
<QuerySet [<User: Mahdi>, <User: Ali>, <User: Mr_milad>]>
```

خب حالا بریم یک پست جدید ایجاد کنیم:

``shell:``

```shell
>>> Post.objects.all()
<QuerySet [<Post: Python>]>
>>> post1 = Post.objects.create(author=user2, title='Django', description='Django is a free and open source web-based software framework')
>>> post1
<Post: Django>
>>> Post.objects.all()
<QuerySet [<Post: Python>, <Post: Django>]>
```

چون فیلد (author) از نوع (ForeignKey) هست بهتره از (user) ایجاد کرده استفاده کنیم نه رشته / مابقی فیلد ها هم پر میکنیم.

---

**متد <span class="en-text">get()</span>:** برای دریافت یک (object) از جدول (منطبق با شرایطی که در دستور برایش مشخص میکنیم) استفاده میشه.
Expand Down Expand Up @@ -756,6 +766,8 @@ User.objects.create_user()

**متد <span class="en-text">get_or_create()</span>:**

``shell:``

```shell
>>> Post.objects.get_or_create(author_id=1, title='C language')
(<Post: C language>, True)
Expand All @@ -770,10 +782,30 @@ User.objects.create_user()

خروجی آن (کوئری ست) هستش.

``shell:``

```shell
>>> Post.objects.filter(title='Django')
<QuerySet [<Post: Django>]>
```
با استفاده از 2 تا underscore(__) میتوان فیلد های عناصر مشخص کننده در متد را مشخص کرد

مثال ها

``shell:``

```shell
>>> posts1 = Post.objects.filter(user__id=2)
>>> posts1
<QuerySet [<Post: Django>]>
>>>posts2 = Post.object.filter(publish__year=2023)
>>>posts2
<QuerySet [<Post: Java>, <Post: C#>]>
>>>Post.object.filter(publish__year=2022, author__username="reza")
<QuerySet [<Post: Python>]>
>>>Post.object.filter(publish__year=2024).filter(author__username="ali")
<QuerySet [<Post: Html>]>
```

---

Expand Down Expand Up @@ -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
Expand All @@ -1179,20 +1213,22 @@ urlpatterns = [

#### کاربرد (app_name) و (name) در فایل (url)

اگه خواستیم از (url) که ایجاد کرده ایم در جایی استفاده کنیم بجای نوشتن آن آدرس طولانی به صورت زیر عمل میکنیم:
اگر در پروژه، چند اپلیکیشن داشتیم برای دسترسی راحت تر به urlهای هر اپلیکیشن میتوان برای فایل های (urls.py) آنها یک namespace (app_name) تعریف کنیم و بجای نوشتن آن آدرس طولانی به صورت زیر عمل میکنیم:

app_name: (name in path)

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`
Expand Down
63 changes: 61 additions & 2 deletions season-03.md
Original file line number Diff line number Diff line change
Expand Up @@ -212,12 +212,71 @@ class Post(models.Model):
{% block content %}
<h1>جزئیات پست</h1>
<h3>{{ post.title }} توسط {{ post.author }}</h3>
<p>{{ post.description | linebreaks }}</p>
<p>{{ post.description |linebreaks }}</p>
<hr>
<p>{{ post.publish | jformat }}</p>
<p>{{ post.publish |jformat|"%Y/%m/%d-%H:%M" }}</p>
{% 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``

```
...
<p>{{ new_date }}</p>
...
```

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

```jinja
<p>{{ new_date |date }}</p>
<p>{{ new_date |date:"DATE_FORMAT" }}</p>
<p>{{ new_date |date:"DATETIME_FORMAT" }}</p>
<p>{{ new_date |date:"SHORT_DATE_FORMAT" }}</p>
<p>{{ new_date |date:"SHORT_DATETIME_FORMAT" }}</p>
```
فرمت های تعریف شده برای date

```jinja
<p>{{ new_date |date:"سال:Y ماه:m" }}</p>
```


میتوان برای date مقادیر دلخواهی را قرار داد.

از فیلتر time و مقادیر آن هم میتوان برای فرمت دهی ساعت استفاده کرد.

برای مطالعه بیشتر می توانید <a href="https://docs.djangoproject.com/en/5.1/ref/templates/builtins/#date">داکیومنت</a> این بخش را بخوانید.