بخش های اصلی

آموزش Django

Django – URL Mapping

اکنون که به روشی که در بخش قبلی توضیح دادیم، یک view ایجاد کردیم که کار می کنه، می خوایم از طریقِ URL به آن view دسترسی پیدا کنیم. Django برای map کردنِ URL روش خودش را داره و از طریق ویرایش یکی از فایل های پروژه به نامِ url.py (myproject/url.py)، این کار را انجام میده. فایلِ  url.py باید بصورت زیر باشه –

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
)

وقتی کاربر در برنامه، درخواستی به صفحه می فرسته، کنترلرِ (controller) Django، از طریق فایلِ url.py بدنبالِ view مربوطه می گرده و بعد از انجام جستجو، پاسخِ HTML را برمی گرداند یا اگه پیدا نکنه، خطایِ 404 "پیدا نشد" را برمی گرداند. مهم ترین چیز در url.py، "urlpatterns" tuple است. urlpatterns، جاییِه که map میانِ URLها و viewها در آن تعریف می شه. map کردن، یک tuple در الگوی طراحیِه و بصورت زیرِه –

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
   url(r'^hello/', 'myapp.views.hello', name = 'hello'),
)

قسمتی از کد که با رنگ قرمز مشخص شده، در فایلِ myapp/view.py،  URL “/home” را به viewای با نامِ hello، map می کنه. همان طور که می بینین، map کردن از سه عنصر زیر تشکیل شده –

  • الگو (pattern) – regexp، URLای که میخواین به آن رسیدگی و map بشه را سازگار می کنه. هر چیزی که با ماژول ‘re’یِ python کار کنه، برای الگو قابل قبوله (برای زمانی که بخواین پارامترها را با url پاس بدین، کارآمده).
  • python path به view – مثل وقتی که ماژول را import می کنین است.
  • نام – برای اجرای URL معکوس، بایدهمانطور که در مثال میبینین، از الگوهایِ URLای که دارای نام هستن استفاده کنین. بعد از انجام این کار برای دسترسی به view با :http://127.0.0.1/hello، سرور را اجرا کنین.

سازمان دهیِ URLها

پیش تر، URLها را در فایلِ “myprojects/url.py” ایجاد کردیم، به هر حال همان طور که پیش تر هم راجع به Django و ایجاد برنامه توضیح دادیم، بهترین مزیت، امکان استفاده ی مجدد از برنامه ها در پروژه های مختلف بود. اگه همه ی URLها را در فایلِ “projecturl.py” ذخیره کنین، می توانید به سادگی مشکل را پیدا کنین. بنابراین خوبه که برای هر برنامه یک فایلِ “url.py” ایجاد کنین و آن را در فایل اصلی پروژه به نامِ “url.py”، include کنین (ما پیش تر URLهای admin را برای رابطِ admin، include کردیم)

organize urls

نحوه ی انجام کار

باید با استفاده از کد زیر؛ یک فایل به نامِ “url.py” در myapp ایجاد کنین –

from django.conf.urls import patterns, include, url

urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello'),)

سپس myproject/url.py، بصورت زیر تغییر خواهد کرد –

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
   url(r'^myapp/', include(myapp.urls)),
)

تمام URLهای برنامه ی myapp را include کرده ایم. home.html که از طریقِ “/hello” مورد دسترسی قرار می گرفت، حالا از طریقِ “/myapp/hello” مورد دسترسی قرار میگیره که بهترِه و برای برنامه ی وب، ساختار قابل درک تری داره.

my project

اکنون تصور کنین که در myapp “morning” یک view دیگه دارین و می خواین آن را به myapp/url.py، map کنین، برای این کار باید myapp/url.py را تغییر بدین –

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
   url(r'^hello/', 'myapp.views.hello', name = 'hello'),
   url(r'^morning/', 'myapp.views.morning', name = 'morning'),
)

کد بالا باید بصورت زیر تغییر کنه :

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),)

همانطور که میبینین، از اولین عنصرِ urlpatterns tuple استفاده کرده ایم. این کار برای زمانی که بخواین نام برنامه را تغییر بدین، کارآمده.

url patterns

فرستان پارامترها به Viewها

اکنون نحوه ی map کردنِ URLها و نحوه ی سازمان دهیِ آن ها را بلدین، حالا اجازه بدین تا نحوه ی فرستان پارامترها به viewها را هم به شما یاد بدیم. مثالِ article (میخواین از طریقِ “/articles/article_id” به article دسترسی پیدا کنین)، یک مثال کلاسیکِه.

پاس دادن پارامترها با گرفتنِ آن ها از طریقِ regexp در الگویِ URL انجام میشه. فرض کنین یک view مثل view زیر در “myapp/view.py” داریم

from django.shortcuts import render
from django.http import HttpResponse

def hello(request):
   return render(request, "hello.html", {})

def viewArticle(request, articleId):
   text = "Displaying article Number : %s"%articleId
   return HttpResponse(text)

می خوایم این view را در myapp/url.py، map کنیم، با این کار می توانیم از طریقِ “/myapp/article/articleId” به آن دسترسی پیدا کنیم. به نوشتن کد زیر در “myapp/url.py” احتیاج داریم:

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(d+)/', 'viewArticle', name = 'article'),)

وقتی Django url: “/myapp/article/42” را ببینه، پارامترِ ‘42’ را به viewای با نامِ viewArticle پاس میده و باید در مرورگر خروجی بصورت زیر مشاهده  کنین –

passing parameters to view article

در نظر داشته باشین که ترتیب پارامترها در این جا مهمِه. فرض کنین لیستی از articleهای مربوط به یک ماه و سال خاص را می خوایم، view ای با نامِ viewArticles  اضافه کنین. فایلِ view.py بصورت زیر خواهد بود:

from django.shortcuts import render
from django.http import HttpResponse

def hello(request):
   return render(request, "hello.html", {})

def viewArticle(request, articleId):
   text = "Displaying article Number : %s"%articleId
   return HttpResponse(text)

def viewArticle(request, month, year):
   text = "Displaying articles of : %s/%s"%(year, month)
   return HttpResponse(text)

فایلِ url.py مربوطه به شکل زیر خواهد بود:

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(d+)/', 'viewArticle', name = 'article'),
   url(r'^articles/(d{2})/(d{4})', 'viewArticles', name = 'articles'),)

اکنون اگه به “/myapp/articles/12/2006/” برین، 'Displaying articles of: 2006/12' را مشاهده خواهید کرد ولی اگه پارامترها را برعکس کنین چنین خروجی مشاهده نخواهید کرد.

displaying articles

برای اجتناب از این امر، می توانید یک پارامترِ URL را به پارامترِ view، لینک کنین. بعد از انجام این کار فایلِ url.py بصورت زیر خواهد بود –

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(d+)/', 'viewArticle', name = 'article'),
   url(r'^articles/(?Pd{2})/(?Pd{4})', 'viewArticles', name = 'articles'),)

مبحث آموزشی

آموزش Django

Learn Django

پرســیدن سؤال جدید

سؤال های تخصصی خود را از ما بپرسید

تبلیغات

دنبال کردن تلگرام کانال سافت اسکیل

https://telegram.me/softskill_ir

آخرین مقالات

عملیات کاربران

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد