FA-TOOLS — Header Component

آموزش ساخت وب‌سایت ساده با Django

🌟 رفیق برنامه‌نویس، آماده‌ای برای ساخت اولین وب‌سایتت با جنگو؟
اینجا یه نقشه راه کامل و کاربردی برات چیدیم که قدم به قدم کنارتیم.
هر ابزار و اسنیپت کدی که لازم داری، تو فروشگاه ابزارهای ما هست. یه سر بزن و کارتو راحت‌تر کن!

  • ۱. آماده‌سازی: نصب پایتون و جنگو، ساخت محیط مجازی.
  • 🛠️ ۲. پروژه جدید: ایجاد یک پروژه جنگو و اپلیکیشن.
  • 🏗️ ۳. مدل‌سازی: تعریف ساختار داده‌ها (دیتابیس).
  • 🎨 ۴. ویوها و تمپلت‌ها: نمایش محتوا به کاربر.
  • 🔗 ۵. مسیریابی (URLs): ارتباط دهی صفحات.
  • 🚀 ۶. تست و اجرا: راه‌اندازی وب‌سایت و عیب‌یابی.

نیاز به مشاوره داری؟ همین الان باهامون تماس بگیر:
09202232789

۱. آماده‌سازی محیط توسعه: اولین قدم

آموزش ساخت وب‌سایت ساده با Django — تصویر 1

برای شروع ساخت هر پروژه‌ای با جنگو، اول از همه باید ابزارهای لازم رو داشته باشی. فکر کن میخوای بری سفر، بدون ماشین نمیشه که! پایتون و جنگو هم ماشین تو هستن.

۱.۱. نصب پایتون و Pip

پایتون قلب جنگو هست. باید مطمئن شی که پایتون روی سیستمت نصب شده. برای بررسی، ترمینال یا Command Prompt رو باز کن و این دستور رو بزن:

python --version
pip --version

اگه نسخه‌ای رو دیدی، که هیچی. اگر نه، باید از سایت رسمی پایتون (python.org) دانلود و نصبش کنی. حواست باشه که موقع نصب تیک “Add Python to PATH” رو بزنی تا پایتون به درستی تو سیستمت شناخته شه. Pip هم که مدیر بسته پایتونه و معمولاً همراه پایتون نصب میشه.

۱.۲. محیط مجازی (Virtual Environment)

این قسمت خیلی مهمه! هر پروژه جنگو بهتره محیط مجازی خودش رو داشته باشه. اینجوری پکیج‌هایی که نصب می‌کنی برای یک پروژه خاص، با پکیج‌های پروژه‌های دیگه قاطی نمیشن. یه جورایی هر پروژه رو تو یه جعبه جدا نگه می‌داری. برای ساخت و فعال‌سازی محیط مجازی:

# یه پوشه برای پروژه بساز
mkdir my_django_project
cd my_django_project

# محیط مجازی رو بساز
python -m venv venv

# فعالش کن
# ویندوز:
venvScriptsactivate
# مک/لینوکس:
source venv/bin/activate

حالا می‌بینی که اسم `(venv)` کنار خط فرمانت ظاهر شده. یعنی محیط مجازی فعال هست.

۱.۳. نصب Django

حالا که محیط مجازی فعال شده، وقت نصب جنگو هست. خیلی راحت این دستور رو بزن:

pip install Django

این دستور آخرین نسخه پایدار جنگو رو نصب میکنه. اگر نیاز به نسخه‌های قدیمی‌تر یا خاصی از جنگو داشتی، می‌تونی ورژنش رو مشخص کنی، مثلاً `pip install Django==3.2`.
برای دسترسی به اسنیپت‌های مفید پایتون، می‌تونی یه نگاهی به کدهای آماده پایتون بندازی.

۲. ساخت پروژه و اپلیکیشن جدید

آموزش ساخت وب‌سایت ساده با Django — تصویر 2

خب، حالا که همه چی آماده هست، بریم سراغ ساخت پروژه. تو جنگو، یک “پروژه” یه کانتینر برای کل وب‌سایت تو هست و “اپلیکیشن‌ها” قسمت‌های مختلف و جداگانه پروژه رو تشکیل میدن. مثلاً یه اپ برای وبلاگ، یه اپ برای کاربران.

۲.۱. ساخت پروژه جنگو

در حالی که محیط مجازی فعاله و داخل پوشه `my_django_project` هستی، این دستور رو بزن:

django-admin startproject mysite .

نقطه `.` تو انتهای دستور مهمه. این کار باعث میشه فایل‌های پروژه تو همون پوشه فعلی `my_django_project` ایجاد بشن، نه تو یه پوشه تودرتوی دیگه. اگه نقطه رو نزنی، یه پوشه دیگه به اسم `mysite` داخل `my_django_project` میسازه و پروژه اونجا میره.

۲.۲. ساخت اپلیکیشن

حالا که پروژه رو داریم، یه اپلیکیشن بسازیم. اسمش رو میذاریم `blog` چون میخوایم یه وبلاگ ساده بسازیم.

python manage.py startapp blog

این دستور یه پوشه به اسم `blog` تو پروژه میسازه که کلی فایل مثل `models.py`، `views.py` و `admin.py` داخلش هستن.

۲.۳. معرفی اپلیکیشن به پروژه

برای اینکه پروژه `mysite` بدونه که یه اپلیکیشن `blog` داریم، باید اونو تو فایل `settings.py` اضافه کنیم.
فایل `mysite/settings.py` رو باز کن و اسم `blog` رو به لیست `INSTALLED_APPS` اضافه کن:

# mysite/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog', # اینجا اضافه کن
]

۳. تعریف مدل‌ها (Models): ساختار دیتابیس

آموزش ساخت وب‌سایت ساده با Django — تصویر 3

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

فایل `blog/models.py` رو باز کن و این کد رو توش بذار:

# blog/models.py

from django.db import models
from django.utils import timezone

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.title

اینجا یه مدل `Post` ساختیم با سه تا فیلد: `title` (عنوان پست)، `content` (متن اصلی) و `pub_date` (تاریخ انتشار).
تابع `__str__` هم باعث میشه وقتی یه شیء از `Post` رو پرینت می‌کنی، عنوانش نمایش داده شه.

۳.۱. ساخت Migrationها و اعمال به دیتابیس

وقتی مدل‌ها رو تغییر میدی، باید به جنگو بگی این تغییرات رو به دیتابیس هم اعمال کنه.

python manage.py makemigrations blog
python manage.py migrate

`makemigrations` فایل‌هایی رو میسازه که تغییرات مدل‌هات رو توضیح میدن. `migrate` هم این تغییرات رو به دیتابیس اعمال میکنه.

۴. Viewها و Templateها: نمایش محتوا

Viewها منطق اصلی وب‌سایت ما رو نگهداری می‌کنن و تصمیم می‌گیرن چی به کاربر نشون بدن. Templateها هم ظاهر و رابط کاربری رو میسازن (همون فایل‌های HTML).

۴.۱. نوشتن Viewها

ما دوتا View میخوایم: یکی برای نمایش لیست پست‌ها و یکی برای نمایش جزئیات هر پست.
فایل `blog/views.py` رو باز کن و این کد رو بنویس:

# blog/views.py

from django.shortcuts import render, get_object_or_404
from .models import Post

def post_list(request):
    posts = Post.objects.all().order_by('-pub_date')
    return render(request, 'blog/post_list.html', {'posts': posts})

def post_detail(request, pk):
    post = get_object_or_404(Post, pk=pk)
    return render(request, 'blog/post_detail.html', {'post': post})

`post_list` همه پست‌ها رو از دیتابیس میگیره و مرتبشون میکنه. `post_detail` هم یه پست خاص رو با `pk` (کلید اصلی) پیدا میکنه و اگه نبود، ارور 404 میده.

۴.۲. ساخت Templateها

حالا باید فایل‌های HTML رو بسازیم.
تو پوشه `blog`، یه پوشه به اسم `templates` بساز، و داخل `templates` هم یه پوشه دیگه به اسم `blog` بساز. پس مسیرت میشه `blog/templates/blog/`.
داخل این پوشه، دوتا فایل `post_list.html` و `post_detail.html` رو بساز.

**`blog/templates/blog/post_list.html`:**

<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>لیست پست‌ها</title>
    <style>
        body { font-family: 'Tahoma', sans-serif; line-height: 1.6; color: #333; margin: 0; padding: 20px; background-color: #f4f4f4; }
        .container { max-width: 800px; margin: 20px auto; background: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
        h1 { color: #2C3E50; text-align: center; margin-bottom: 30px; }
        .post-card { background-color: #ecf0f1; border-radius: 6px; padding: 20px; margin-bottom: 20px; box-shadow: 0 1px 3px rgba(0,0,0,0.08); }
        .post-card h2 { color: #34495E; margin-top: 0; margin-bottom: 10px; font-size: 1.8em; }
        .post-card h2 a { text-decoration: none; color: #3498DB; transition: color 0.3s ease; }
        .post-card h2 a:hover { color: #2980B9; }
        .post-card p { font-size: 0.95em; color: #555; }
        .post-card .date { font-size: 0.8em; color: #7f8c8d; text-align: left; }
    </style>
</head>
<body>
    <div class="container">
        <h1>آخرین مطالب وبلاگ</h1>
        {% for post in posts %}
            <div class="post-card">
                <h2><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h2>
                <p>{{ post.content|truncatechars:150 }}</p>
                <p class="date">تاریخ انتشار: {{ post.pub_date }}</p>
            </div>
        {% empty %}
            <p>هیچ پستی برای نمایش وجود ندارد.</p>
        {% endfor %}
    </div>
</body>
</html>

**`blog/templates/blog/post_detail.html`:**

<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ post.title }}</title>
    <style>
        body { font-family: 'Tahoma', sans-serif; line-height: 1.8; color: #333; margin: 0; padding: 20px; background-color: #f4f4f4; }
        .container { max-width: 800px; margin: 20px auto; background: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
        h1 { color: #2C3E50; text-align: center; margin-bottom: 20px; font-size: 2.2em; }
        .post-meta { text-align: center; color: #7f8c8d; font-size: 0.9em; margin-bottom: 30px; }
        .post-content { font-size: 1.1em; color: #444; text-align: justify; }
        .back-link { display: block; text-align: center; margin-top: 40px; text-decoration: none; color: #3498DB; font-weight: bold; transition: color 0.3s ease; }
        .back-link:hover { color: #2980B9; }
    </style>
</head>
<body>
    <div class="container">
        <h1>{{ post.title }}</h1>
        <p class="post-meta">تاریخ انتشار: {{ post.pub_date }}</p>
        <div class="post-content">
            <p>{{ post.content|linebreaksbr }}</p>
        </div>
        <a href="{% url 'post_list' %}" class="back-link">بازگشت به لیست پست‌ها</a>
    </div>
</body>
</html>

اینجا یه استایل ساده CSS هم مستقیماً داخل فایل‌های HTML گذاشتیم تا ظاهر وب‌سایت تو موبایل، تبلت و دسکتاپ خوب به نظر برسه (رسپانسیو باشه). اگه میخوای استایل‌های پیشرفته‌تر بنویسی، به کدهای آماده CSS ما یه سر بزن.

۵. مسیریابی (URLs): اتصال صفحات

حالا باید Viewهامون رو به URLهای مشخصی وصل کنیم تا کاربر بتونه بهشون دسترسی داشته باشه.

۵.۱. URLهای اپلیکیشن

اول، تو پوشه `blog` یه فایل به اسم `urls.py` بساز.

# blog/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.post_list, name='post_list'),
    path('post/<int:pk>/', views.post_detail, name='post_detail'),
]

اینجا دوتا مسیر تعریف کردیم:
* `”`: مسیر اصلی اپلیکیشن `blog` که به View `post_list` وصل میشه.
* `’post//’`: برای نمایش جزئیات یک پست، که یه عدد صحیح (`pk`) رو از URL میگیره و به `post_detail` میفرسته.

۵.۲. URLهای پروژه اصلی

حالا باید URLهای اپلیکیشن `blog` رو به پروژه `mysite` معرفی کنیم.
فایل `mysite/urls.py` رو باز کن و این تغییرات رو اعمال کن:

# mysite/urls.py

from django.contrib import admin
from django.urls import path, include # include رو اضافه کن

urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls')), # اینجا اضافه کن
]

با این کار، هر آدرسی که با `/blog/` شروع بشه، به فایل `blog/urls.py` ارجاع داده میشه.

۶. ادمین پنل: مدیریت محتوا

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

۶.۱. ساخت کاربر سوپریوزر

اول یه کاربر مدیر (super user) بساز:

python manage.py createsuperuser

بعدش نام کاربری (username)، ایمیل (اختیاری) و پسورد رو وارد کن.

۶.۲. ثبت مدل در ادمین

برای اینکه بتونی پست‌های وبلاگت رو از طریق پنل ادمین مدیریت کنی، باید مدل `Post` رو تو `blog/admin.py` ثبت کنی:

# blog/admin.py

from django.contrib import admin
from .models import Post

admin.site.register(Post)

نکته امنیتی:
تو پروژه‌های واقعی، هیچ‌وقت اطلاعات حساس رو تو `settings.py` یا کدهای اصلی نذار. از متغیرهای محیطی استفاده کن.
برای امنیت بیشتر وب‌سایت، می‌تونی به اسنیپت‌های امنیتی نگاهی بندازی.

۷. اجرای پروژه و مشاهده وب‌سایت

کار اصلی تموم شده! حالا وقتشه که پروژه‌ت رو اجرا کنی و نتیجه کارت رو ببینی.

python manage.py runserver

بعد از اجرای این دستور، یه آدرس مثل `http://127.0.0.1:8000/` تو ترمینال نمایش داده میشه.
این آدرس رو تو مرورگرت باز کن:
* برای دیدن وبلاگ: `http://127.0.0.1:8000/blog/`
* برای پنل ادمین: `http://127.0.0.1:8000/admin/` (با یوزر و پسوردی که ساختی وارد شو و می‌تونی پست اضافه کنی)

بعد از اضافه کردن چند پست از پنل ادمین، می‌تونی لیست پست‌ها و جزئیات هر کدوم رو تو آدرس `/blog/` ببینی.

۸. عیب‌یابی سریع: راه‌حل مشکلات رایج

وقتی داری با یه فریم‌ورک کار می‌کنی، ممکنه به مشکلاتی بخوری. نگران نباش، این طبیعیه. اینجا چندتا مشکل رایج و راه‌حلشون رو برات آوردم.

جدول عیب‌یابی مشکلات رایج Django
مشکل راه‌حل
“ModuleNotFoundError: No module named ‘django'” مطمئن شو که محیط مجازی رو فعال کردی و Django رو با `pip install Django` داخل همون محیط نصب کردی.
“NameError: name ‘Post’ is not defined” این یعنی مدل `Post` رو از `blog.models` ایمپورت نکردی. چک کن که `from .models import Post` رو تو `views.py` یا `admin.py` درست نوشتی.
“TemplateDoesNotExist” جنگو نتونسته فایل Template رو پیدا کنه. مطمئن شو که مسیر فایل‌های HTML مثل `blog/templates/blog/post_list.html` رو درست ساختی و تو `settings.py` تنظیمات `TEMPLATES` صحیحه. (معمولاً با `startapp` درست تنظیم میشه.)
“NoReverseMatch at /blog/” این ارور یعنی آدرس URL با نامی که تو `{% url ‘…’ %}` استفاده کردی، پیدا نشده. چک کن که `name=’post_detail’` یا `name=’post_list’` رو تو فایل‌های `urls.py` درست نوشتی و اونا رو تو `mysite/urls.py` اینکلود کردی.
تغییرات دیتابیس اعمال نمیشن بعد از هر تغییر در `models.py` حتماً `python manage.py makemigrations` و `python manage.py migrate` رو اجرا کن.

نتیجه‌گیری

رفیق، تبریک می‌گم! تو حالا یه وب‌سایت ساده با جنگو ساختی. این فقط شروع راهه. جنگو دنیایی از امکانات رو جلوی پات میذاره، از APIهای پیچیده گرفته تا سیستم‌های احراز هویت.
برای اینکه پروژه‌های بزرگتری بسازی و کدنویس حرفه‌ای‌تری بشی، همیشه دنبال یادگیری باش و از منابع و ابزارهای خوب استفاده کن.
کدهای جاوااسکریپت و HTML هم میتونن مکمل پروژه‌ات باشن، برای همین به کدهای آماده JS و کدهای آماده HTML هم یه نگاهی بنداز.
به یاد داشته باش، هر مشکلی که تو برنامه‌نویسی باهاش روبرو میشی، یه فرصته تا یه چیز جدید یاد بگیری.

قدم بعدی چیه؟

حالا که با اصول جنگو آشنا شدی، میتونی این وب‌سایت رو توسعه بدی:

  • ✔️ اضافه کردن CSS و JavaScript پیشرفته برای ظاهر زیباتر.
  • ✔️ افزودن قابلیت کامنت‌گذاری به پست‌ها.
  • ✔️ استفاده از سیستم احراز هویت جنگو برای کاربران.
  • ✔️ دیپلوی کردن پروژه روی یک سرور واقعی.

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

Table of Contents

آخرین نوشته‌ها