ساخت URL برای وبلاگ در جنگو
تو این آموزش قراره برای وبلاگمون URLهای مورد نیاز رو بسازیم.
ساخت الگوهای URL مورد نیاز برای View ها
الگوهای URL ای که تعریف میکنیم بهمون اجازه میدن که هر URL رو به view مورد نظرمون وصل کنیم.
در حقیقت الگوهای URL از 3 قسمت تشکیل شده ان. یه الگوی متنی(که قراره آدرس URL ما رو برامون نشون بده)، یه view (که بفهمه URL مورد نظر باید چه view ای رو اجرا کنه، و در نهایت دلخواه برای اون URL که بتونیم از کل پروژه با اون اسم بهش دسترسی داشته باشیم.
سیستم جنگو به این صورته که هر الگوی URL ای که پیدا کنه رو میخونه و هر زمان که request ای مطابق با یه آدرس بهش داده بشه همون رو بر میگردونه.
بعدش میاد view ای که توی اون الگوی URL صدا زده شده رو ایمپورت و اجرا میکنه.
خب دیگه توضیحات کافی دادیم. حالا بریم سر وقت تعریف الگوی URL مون.
برای اینکار توی اپلیکیشن blog یه فایل با اسم urls.py میسازیم و کدهای زیر رو توش وارد میکنیم:
from . import views from django.urls import path app_name = 'blog' urlpatterns = [ # post views path('', views.post_list, name='post_list'), path('<int:year>/<int:month>/<int:day>/<slug:post>/', views.post_detail, name='post_detail'), ]
توی این کدی که نوشتیم، برای اپلیکیشنمون یه اسم قرار دادیم که بعداً میتونیم هر زمان که خواستیم به اپلیکیشن blog مون دسترسی پیدا کنیم، راحت از هر جای پروژه بتونیم.
بعدش اومدیم 2 تا ()path رو به سیستم جنگو معرفی کردیم.
(همونطور که شاید از اسمش حدس زده باشین، از تابع path برای معرفی الگوهای URL به فریمورک جنگو استفاده میکنیم.)
حالا الگوی URL اول که تعریف کردیم هیچ آرگومانی رو به عنوان ورودی نمیگیره، و فقط میایم view ای که قبلاً با نام post_list تعریف کرده بودیم رو وصل میکنیم بهش. و در نهایت یه اسم هم براش انتخاب کردیم.
تو الگوی بعدی اومدیم 4 تا آرگومان ورودی رو برای الگوی URL مون درخواست کردیم:
- year,month,day: مقدار int میخوان
- post: میتونه ترکیبی از حروف و علائم باشه.
بچه ها همونطور که میبیند، هر وقت بخوایم از URL یک مقداری رو بگیریم، باید بیایم از <> استفاده کنیم. (بهش میگن path converter)
میتونین لیست کاملی از path converter ها رو از اینجا ببینید:
https://docs.djangoproject.com/en/3.0/topics/http/urls/#pathconverters
علاوه بر ()path که اینجا دیدید، در صورتی که بخوایم الگوهای URL پیچیدهتری بنویسیم میتونیم از ()re_path که از regular expression های پایتون بهره میبره استفاده کنیم.
نکته: برای اینکه قابلیت reuse اپلیکیشن بالا بره، بهتره که برای هر اپلیکیشن یه فایل urls.py مجزا داشته باشیم.
در نهایت هم برای اینکه فایل urls ای که توی اپلیکیشن blog تعریف کردیم رو به الگوهای URL پروژه مون بشناسونیم باید بیایم و اون رو داخل url های پروژه قرار بدیم.
پس از دایرکتوری mysite وارد فایل urls.py میشیم و تغییرات زیر رو اعمال میکنیم:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('blog/', include('blog.urls', namespace='blog')), ]
تو خط اول اومدیم و کتابخانه include رو ایمپورت کردیم.
همونطور که مشاهده میکنین تو قسمت urlpatterns 2 تا path وجود داره.
اولی که آدرس admin ما هستش.
با خط دومی که اومدیم تعریف کردیم، داریم میگیم وقتی کسی خواست وارد آدرس blog از سایت ما بشه(ینی اومد و توی url جلوی آدرس سایت ما نوشت blog – مثلاً https://djangocenter.ir/blog -) اونوقت بیا و آدرس وارد شده رو با فایل urls که برات include کردیم مطابقت بده و اجرا کن.
در نهایت هم که namespace براش مشخص کردیم که بعداً راحتتر بتونیم به آدرسهای blog دسترسی داشته باشیم.
URLهای کنونیکال برای مدلهای جنگو
خب این URL کنونیکال که گفتیم اصلاً چیه؟!
ممکنه توی سایتمون صفحات مختلفی وجود داشته باشن که از طریق اون مطلب ما نمایش داده بشه، اما فقط یک صفحه خواهد بود که ترجیح میدیم به عنوان صفحه اصلی اون مطلب در نظر گرفته بشه(مصارف سئو داره بیشتر). به اون یک صفحه ی خاص که نسخه ترجیحی ما هستش میگیم URL کنونیکال.
حالا توی جنگو برای اینکه این قابلیت رو ایجاد کنیم، باید برای مدلی که قراره URL کنونیکال براش داشته باشیم، از متد ()get_absolute_url استفاده کنیم.
برای ساخت URL کنونیکال برای اشیای Post، میایم و از URL ای که قبلاً با name=post_detail تعریفش کرده بودیم استفاده میکنیم.
برای اینکار باید از متد ()reverse استفاده کنیم.
از اپلیکیشن blog فایل models.py رو باز و کد زیر رو بهش اضافه میکنیم:
from django.urls import reverse class Post(models.Model): # ... کدهای قبلی def get_absolute_url(self): return reverse('blog:post_detail', args=[self.publish.year, self.publish.month, self.publish.day, self.slug])
برای اینکه توی template هم بتونیم کار رو کامل کنیم، باید اونجا از متد get_absolute_url استفاده کنیم (توی آموزش بعدی میبینیم).
فرمت های مختلفی به عنوان الگوی URLها میشه نوشت که اینجا به موارد ساده اش بسنده کردیم.
در دوره دوره ساخت وبلاگ با جنگو موارد بیشتری رو یاد میدیم. و همینطور هم نحوه ساخت URLهای جنگو که از زبان فارسی پشتیبانی کنن هم بهتون نشون میدیم.
در قسمت بعدی برای این URL هایی که ایجاد کردیم، میایم و قالب گرافیکی یا همون template های مورد نیاز رو میسازیم.
میتونین از اینجا وارد آموزش ساخت template نمایش مطالب وبلاگ جنگو بشید.
آموزشهای بیشتر رو میتونین ازمشاهده کنین.
تو آموزش های بعدی مرکز تخصصی آموزش جنگو، کلی مباحث مختلف و خوب داریم که بتونید هرچی بیشتر با مباحث فریمورک قدرتمند جنگو آشنا بشید و یادشون بگیرید.
سوالات و نظراتتون رو هم حتماً حتماً با ما در میون بذارید.
مطالب زیر را حتما مطالعه کنید
صفحه بندی صفحات در جنگو
کار با template ها در جنگو
ساخت view برای وبلاگ در جنگو
manager ها در جنگو
کار با دیتابیس جنگو
ساخت پنل ادمین جنگو
2 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
عالیییی بود خیلی ممنونم ازتون❤️
من می خوام slug های جنگو را بتونم مثل وردپرس دستی وارد کنم و کوتاه باشه حتی دسته بندی هم درج نکنم داخل آدرس پست،
بصورت slug:slug
مثال
site . ir / post
site . ir/ category
و…
ولی پیشفرض جنگو اجازه چنین کاری نمیده و فقط یک مورد را می تونم به این صورت وارد کنم، راه حلی براش هست؟
سلام دوست عزیزم
خوشحالیم که این مطلب براتون مفید بوده
در خصوص سوالتون، منظورتون این هستش که 2 تا آدرسه url یکسان داشته باشین یا متفاوت؟
اگر ممکنه واضحتر بگین سوالتون رو بهتره، متوجه نشدم چون هنوز
ممنون و منتظرتون هستیم