درک توابع میان‌بُر جنگو برای توسعه سریع‌تر ویوها

این مقاله توابع میان‌بُر جنگو مانند render()، redirect()، resolve_url()، get_object_or_404() و get_list_or_404() را بررسی می‌کند. این توابع عملیات رایج ویوها مانند رندر قالب، ایجاد ریدایرکت، تبدیل ورودی به URL معتبر و واکشی ایمن آبجکت‌ها را ساده‌تر کرده و کدنویسی را سریع‌تر و خواناتر می‌کنند.

میان‌بر جنگوrenderget_object_or_404

~3 دقیقه مطالعه • بروزرسانی ۲۳ اسفند ۱۴۰۴

مقدمه

ماژول django.shortcuts مجموعه‌ای از توابع کمکی ارائه می‌دهد که چندین لایه از معماری جنگو را در یک عملیات ساده ترکیب می‌کنند. این توابع برای ساده‌سازی کارهای رایج ویوها طراحی شده‌اند و امکان رندر قالب، ریدایرکت، تبدیل ورودی به URL و واکشی ایمن آبجکت‌ها را فراهم می‌کنند.


تابع render()

تابع render() یک قالب را با یک دیکشنری context ترکیب کرده و یک HttpResponse شامل خروجی رندرشده بازمی‌گرداند.


آرگومان‌های ضروری

  • request: شیء درخواست.
  • template_name: مسیر قالب یا لیستی از قالب‌ها.

آرگومان‌های اختیاری

  • context: دیکشنری داده‌های قالب.
  • content_type: نوع MIME.
  • status: کد وضعیت HTTP.
  • using: نام موتور قالب.

نمونه کد

from django.shortcuts import render

def my_view(request):
    return render(
        request,
        "myapp/index.html",
        {"foo": "bar"},
        content_type="application/xhtml+xml",
    )

معادل با:


from django.http import HttpResponse
from django.template import loader

def my_view(request):
    t = loader.get_template("myapp/index.html")
    c = {"foo": "bar"}
    return HttpResponse(t.render(c, request), content_type="application/xhtml+xml")

تابع redirect()

تابع redirect() یک HttpResponseRedirect یا HttpResponsePermanentRedirect برمی‌گرداند.


ورودی‌های قابل قبول

  • یک مدل → فراخوانی get_absolute_url().
  • نام ویو → استفاده از reverse().
  • یک URL کامل یا نسبی → استفاده مستقیم.

کدهای وضعیت

permanentpreserve_requeststatus
TrueFalse301
FalseFalse302
FalseTrue307
TrueTrue308

نمونه‌ها

from django.shortcuts import redirect

def my_view(request):
    obj = MyModel.objects.get(...)
    return redirect(obj)

def my_view(request):
    return redirect("some-view-name", foo="bar")

def my_view(request):
    return redirect("/some/url/")

تابع resolve_url()

تابع resolve_url() ورودی را به یک URL معتبر تبدیل می‌کند. ورودی می‌تواند شامل موارد زیر باشد:


  • آبجکتی با get_absolute_url().
  • نام ویو یا تابع ویو.
  • یک رشته URL.

نمونه

from django.http import JsonResponse
from django.shortcuts import get_object_or_404, resolve_url
from .models import Article

def article_api_view(request, pk):
    article = get_object_or_404(Article, pk=pk)
    return JsonResponse({
        "id": article.pk,
        "title": article.title,
        "url": resolve_url(article),
    })

تابع get_object_or_404()

این تابع تلاش می‌کند یک آبجکت را با get() واکشی کند. اگر آبجکت وجود نداشته باشد، به‌جای DoesNotExist یک Http404 پرتاب می‌کند.


نمونه

from django.shortcuts import get_object_or_404

def my_view(request):
    obj = get_object_or_404(MyModel, pk=1)

معادل با:


from django.http import Http404

def my_view(request):
    try:
        obj = MyModel.objects.get(pk=1)
    except MyModel.DoesNotExist:
        raise Http404("No MyModel matches the given query.")

تابع get_list_or_404()

این تابع نتیجه filter() را به لیست تبدیل کرده و اگر لیست خالی باشد، Http404 پرتاب می‌کند.


نمونه

from django.shortcuts import get_list_or_404

def my_view(request):
    my_objects = get_list_or_404(MyModel, published=True)

معادل با:


from django.http import Http404

def my_view(request):
    my_objects = list(MyModel.objects.filter(published=True))
    if not my_objects:
        raise Http404("No MyModel matches the given query.")

جمع‌بندی

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


نوشته و پژوهش شده توسط دکتر شاهین صیامی