استفاده از APIها در URL

جنگو

سلام

حالا می خواهیم صفحۀ مربوط به تاپیک‌های یک بورد را کدنویسی کنیم. اولین کار این است که فایل py را ویرایش کنیم:

Libogram/urls.py

و حالا نوبت نوشتن تابع view است.

boards/views.py

در فولدر templates یک فایل جدید با نام html می سازیم:

templates/topics.html

صفحۀ مربوطه با آدرس http://127.0.0.1:8000/boards/1 را در مرورگر چک می کنیم:

حالا نوبت نوشت فایل py است.

boards/tests.py

در این تست، از یک متد به نام setUp استفاده شده. در این متد ما یک شی از نوع Board را به صورت موقتی ایجاد می کنیم و تست خود را با آن انجام می دهیم. جنگو در زمان تست، تغییری در دیتابیس اصلی ایجاد نمی کند و ما ناچار به این هستیم که یک دیتابیس در هوا ایجاد کنیم و تمام تغییرات مهاجرتی، اجرای تست‌ها و… را به وسیلۀ آن انجام داده و در آخر هم آن را از بین ببریم. در متد setUp  محیطی برای تست تعریف شده است.

    • test_board_topics_view_success_status_code: برای بوردهای موجود کد حالت یا همان Status Codeای برابر با 200 را باز می گرداند.
    • test_board_topics_view_not_found_status_code: اگر وجود نداشت کد 404 یا همان Page Not Found را باز می گرداند.
    • test_board_topics_url_resolves_board_topics_view: بیانگر این است که جنگو از تابع صحیحی جهت view برای نمایش تاپیک‌ها استفاده می کند.

حالا می خواهیم تست خود را اجرایی کنیم:

اما خروجی همراه با خطا خواهد بود:

اگر صفحۀ مرورگر را هم باز کنیم خطای boards.models.DoesNotExist: Board matching query does not exist مشاهده می شود.

اگر هم که در تنظیمات سرور مقدار DEBUG=False باشد، کاربران صرفاً صفحۀ مربوط به خطای 500 Internal Server Error را می بینند.

برای تمرین می خواهیم صفحۀ 404 را از نو برنامه نویسی کنیم:

boards/views.py

دوباره دستور تست را اجرا می کنیم:

خروجی

بله دیگه! همانطوری که انتظار داشتیم اجرا می شود:

حالا می خواهیم ویوی board_topics را از نو بنویسیم:

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

خروجی:

اقدام بعدی این است که باید نام بوردها را به صورت لینک درست کنیم تا کاربر با کلیک روی آن به صفحه‌ای انتقال یابد که تاپیک‌های مربوط به آن بورد در آن نمایش داده می‌شود.

برای شروع کار، برای کلاس HomeTests باید متدهای تست را پیاده سازی کنیم:

boards/tests.py

در این کلاس هم تابع setUp پیاده سازی شده و علت آن هم این است که باید یک شی موقت از Board ایجاد کنیم و  url و response را به  setUp انتقال دهیم و با این کار از ریسپانس یکسانی دوباره استفاده کنیم.

تست جدید همان test_home_view_contains_link_to_topics_page است. در متد assertContains چک می شود که آیا response body شامل محتوایی هست یا نه. محتوایی که در فایل تست استفاده می شود همان href  از تگ a است. پس به زبان ساده چک می کنیم که آیا response body شامل href=”/boards/1/” می شود یا خیر.

  1. تست می کنیم:

خروجی:

حالا کدی می نویسیم که مشکل این تست برطرف شود.

templates/home.html

در واقع صرفا {{ board.name }} به <a href=”{% url ‘board_topics’ board.pk %}”>{{ board.name }}</a> تغییر یافته است.

یکی از تگ‌های تمپلیت در جنگو {% url %} است که از طریق آن آدرس اپلیکیشن ارسال می شود. پارامتر اول نامِ url است که در py تعریف شده است. (نام و شناسۀ یکتا برای هر آدرس) و بعد از آن هم می توان هر تعداد آرگومانی که نیاز است را ارسال نمود.

اگر هم که آدرس از نوع ساده و ابتدایی باشد نیاز به دنباله نداشته و برای مثال به {% url ‘home’ %} اکتفاء می کنیم.

تست می کنیم:

خروجی:

و این هم خروجی برنامه در مرورگر:

حالا که Django به شکل یک لینک در آمد باید تست مربوط به آن را هم بنویسیم:

boards/tests.py

تست می کنیم:

خروجی:

خطا می دهد چون فایل تمپلیت را آپدیت نکرده ایم.

templates/topics.html

تست می کنیم:

خروجی:

و این هم خروجی در مرورگر:

اگر دو سه بار این بخش خوانده شود مشخص می شود که هیچ کار سخت و پیچیده ای انجام نشده و صرفاً نوشت فایل‌های تست کمی ظرافتکاری دارد وگرنه که یک صفحه در تمپلیت ساختیم و آن را به صورت لینکی قرار دادیم و متناظر آن را هم در فایل view و url . همین!

ترجمۀ اختصاصی توسط تمدن

 

مطلب بعدی: لیستی از الگوهای پرکاربرد URL 

مطلب قبلی: URLهای پیشرفته 

بدون دیدگاه

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

جنگو
ویوی تکمیل بازیابی پسورد

سلام ساخت فایل قالب: templates/password_reset_complete.html {% extends ‘base_accounts.html’ %} {% block title %}Password changed!{% endblock %} {% block content %} <div class=”row justify-content-center”> <div class=”col-lg-6 col-md-8 col-sm-10″> <div class=”card”> <div class=”card-body”> <h3 class=”card-title”>Password changed!</h3> <div class=”alert alert-success” role=”alert”> You have successfully changed your password! You may now proceed to log …

جنگو
ویوی تأیید بازیابی پسورد

سلام نوشتن فایل قالب به شکل زیر: templates/password_reset_confirm.html {% extends ‘base_accounts.html’ %} {% block title %} {% if validlink %} Change password for {{ form.user.username }} {% else %} Reset your password {% endif %} {% endblock %} {% block content %} <div class=”row justify-content-center”> <div class=”col-lg-6 col-md-8 col-sm-10″> <div …

جنگو
ویوی شروع بازیابی پسورد

سلام نوشتن فایل قالب به ترتیب زیر: templates/password_reset_done.html {% extends ‘base_accounts.html’ %} {% block title %}Reset your password{% endblock %} {% block content %} <div class=”row justify-content-center”> <div class=”col-lg-4 col-md-6 col-sm-8″> <div class=”card”> <div class=”card-body”> <h3 class=”card-title”>Reset your password</h3> <p>Check your email for a link to reset your password. If …

هرگونه استفادۀ از این آموزش به صورت رایگان و با ارجاع به تمدن جایز است.